Porque este FROM (SELECT @foo AS foo)
se evalúa antes de este @foo := 1
. Básicamente, cualquier cosa en FROM se evaluará antes de SELECCIONAR.
En realidad, debería ser nulo, pero supongo que ha asignado a su variable de sesión un valor de cero en otro lugar.