You are right.
He uses GOSUB and when times out, RETURN isn't executed. And it will jump with GOTO from HSERIN function to main.
Other workaround is

Code:
getChar:
'Receive a character, if no character within 100ms, then goto main >> IF you use goto main stack overflow, because RETURN isn't executed. 
hserin 100, GetCharError, [flag]
pause 100
hserout ["received a character", 13]

GetCharError:
return