We're hitting something that looks similar with a Chan on 7.2.1, though they might be related..
Sorry, no. That one has a workaround: define your own fixIO:
fixIO :: (a -> IO a) -> IO a
fixIO k = do
m <- newEmptyMVar
ans <- unsafeInterleaveIO (takeMVar m)
result <- k ans
putMVar m result
return result