VSYNCを実行するとBUTTON()の戻り値が初期化されるという認識は正しくありません。
BUTTON()関数は表示更新のたびに戻り値を更新しているだけであって同一フレームの間は同じ値となります。
私のサイトのプチコン3号入門講座のBUTTON()関数のページを参照
http://ochameclub.web.fc2.com/petitcom3/lecture/button.htmでは、なぜVSYNCを付けるのが推奨されているのかというとその表示更新のタイミングまで待つためです。これによって、BUTTON()関数の誤動作を軽減することができます。
しかし、これですべてが説明できるかというとそうではありません。
VSYNCのタイミング(表示更新のタイミング)とBUTTON()関数等の戻り値の更新タイミングでは微妙なずれがあるためだからです。
このずれによってBUTTON(2)が0になるタイミングでは表示更新のタイミングを迎えておらずもう1回VSYNCを挟まないと正常な動作ができないというわけです。
私のサイトのプチコン3号入門講座のVSYNC、WAITのページにおいて表示更新のタイミングとフレームの区切り線が微妙にずらして書かれているのはこの微妙なずれがあるというのを視認できるようにするためです。
http://ochameclub.web.fc2.com/petitcom3/lecture/vsync.htmしかし、普通にBUTTON()関数の値が0になったかの判断ではなくVSYNCの更新ごとにBUTTON()判定を行えばこの微妙なずれを意識する必要はないため特に解説は行っていません。(必要ならば次の更新の機会に書き加えます)