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.