Parce que ce FROM (SELECT @foo AS foo) est évalué avant ce @foo := 1 . Fondamentalement, tout ce qui se trouve dans FROM sera évalué avant votre SELECT.
Il devrait en fait être nul, mais je suppose que vous avez attribué à votre variable de session une valeur de zéro ailleurs.