Both 8-byte and 0-byte are the correct solutions to this source, so you have to play some tricks with fasm to make it choose a different route while resolving. Since "used" has default value FALSE when there is not enough information to make prediction, and this happens in the first pass, it chooses the "skip-if" route in the first pass and this leads to finding the 0-byte solution. You can, however, use this trick to make the first "if" block be assembled in the first pass:
if used x | ~defined @f
x dd 0
end if
@@:
if defined x
a y dd x
end if
As "defined" in the first pass has default value of FALSE, the "if" block gets assembled in the first pass and thus assembler finds the 8-byte solution.