As Squashman stated, it doesn't only compare the first character.
The confusion is in expecting a numeric comparison. The use of quotation marks makes it no longer a numeric comparison, instead, it is comparing the two values as strings.
if "2" lss "10" (echo lower) else (echo higher)
outputs "higher", becasue it is comparing the string "2" to the string "10" alphanumerically.
The "solution" is to have it use leading zeroes:
if "02" lss "10" (echo lower) else (echo higher)
outputs "lower".
using VBScript via evaluate.vbs tends to be the better alternative if you want to exceed the rather basic math capabilities of batch.