The check returns false probably because it returns a length of 1. Meaning, the length exists, and the check is "if length does not exist".
When you call the .value function of $gameVariables, the game forces it to return 0 if the variable has not been set yet to avoid error prompts (which can happen if it returns NULL, nil, whatever)... Since the variable is actually returning a value, the length property still counts it, and thus, length exists.
So your suggestion of putting an evaluation for a value (possibly, > 1) should fix it.