M. Vazquez-Abrams is quite right. This is nothing to do with quotation marks making things that are already strings into strings, or some wrongheaded idea that = in bash's built-in [ command is anything other than a string comparison. (Read § 6.4 of the Bash User Manual, people!) It's everything to do with what happens to empty fields after field-splitting turns words into fields.
If the shell variable loop is empty or null, then $loop expands to an empty field. After field splitting, empty fields are discarded. Note that field splitting and the check for empty fields precedes quote removal. So "$loop" expands to the field "", which is not empty and is thus not removed. After quote removal it is then an empty field, that becomes an empty argument to the command.
The [ command requires its = operator to have two operands, fore and aft. Anything else is a syntax error. Since an empty field is removed, the sequence of words
[ $loop = true ]
expands to
four fields
[
=
true
]
when the [ command needs five to be syntactically correct:
[
-
=
true
]
Of course, the empty string is not equal to the four-character string true, and the command's exit status is non-zero.
Again, all of this is in the Bash User Manual, in §3.5 and §3.5.7. The manual is your friend.