,;=<tab> and <space> are delimiters for cmd.exe and in many cases are ignored if they are not in quotes and act  like empty space.Probably in this case , is taken as the end of the first operand and IF is surprised that there is not valid comparison operator e.g. this will print yep :
if a   ;==;,,=a echo yep
(but will not work if there's a equal sign in the first part of the operands)
But this will not:
if "a   ;" == ";,,=a" echo yep
so to make a valid IF expression when you use comma you need quotes.And this will work 
setLocal enableDelayedExpansion
set test=testString
if "!test:~0,4!" == "test" echo Success
Without delayed expansion substitution is made immediately and this will work without quotes: 
set test=testString
setlocal disableDelayedExpansion
if %test:~0,4% == test echo Succes
endlocal
For the same reason this will be taken as a wrong syntax expression (see jeb's comment):
set "test="
setlocal disableDelayedExpansion
if %test% == test echo Succes
endlocal
May be is not the complete answer , but should be close.As both echo !test:~0,4! and echo %test:~0,4% will work without quotes stays the question why exactly IF fails - may because IF command uses its own parser
As a conclusion - it's always good to use quotes when you compare strings with IF :
- with delayed expansion commas and semicolons will cause troubles. 
- without delayed expansion undefined variables will cause troubles.