MyIf b (fwritec 'a' file) (fwritec 'b' file)の時点で、fileへの参照数が2だと認識されている模様。

まあMyIfを使わず、素直にガードで分岐すれば動作するんだけどね。
ガードやcaseなら、ちゃんとAlternativeだと見なしてくれる。
WriteAorB b file
| b = fwritec 'a' file
= fwritec 'b' file