正解はprocess.nextTick()です。setTimeout(fn, 0)やsetImmediate()よりも優先度が高く、現在の同期処理が終わった直後に割り込んで実行されます。再帰的に呼ぶとI/Oを餓死させる危険があります。