Тъй като това FROM (SELECT @foo AS foo)
се оценява преди това @foo := 1
. По принцип всичко във FROM ще бъде оценено преди вашия SELECT.
Всъщност трябва да е нула, но предполагам, че сте присвоили на променливата на сесията си стойност нула някъде другаде.