If either of the operands in a boolean expression is a variant then both operands are converted to variants. This is documented.
Expressions on variants are evaluated using intrinsic functions implemented in system.variants.pas (_VarOr, _VarAnd, _VarAdd, etc. etc.).
Because of the result of an expression isn't known until these functions has been called the compiler can't do short circuit evaluation on the expression.
Look at the asm generated and it will all make sense
No offense taken, but don't cry wolf just because the dog meows.