Porque este
FROM (SELECT @foo AS foo) é avaliado antes deste @foo := 1 . Basicamente qualquer coisa em FROM será avaliada antes do seu SELECT. Na verdade, deve ser nulo, mas acho que você atribuiu à sua variável de sessão um valor zero em outro lugar.