CreatePipeで作ったパイプのハンドルは、読み書き可能になるとシグナル状態になるような気がなんとなくしていたのですが、ちゃんと調べたらそんな事はなかったです。NT系ならば非同期IOを使えばうまくできますが、95系を考えるとうまくやる方法がなさそうです。PeekNamedPipe*1を使うとデータが来ているかどうかは調べられますが、逆側のエンドポイントがパイプを閉じても検出できなそうです。仕方がないので、各パイプに対してスレッドを作成して読み書きする必要がありそうです。
というわけで、QMAIL3からプロセスを起動して標準入出力をパイプでつないだ時に、標準出力から読めない間に標準エラー出力にパイプのバッファサイズより大きいデータが出力されるとハングってしまっていたのを直しました。
*1 名前に反して名前なしパイプでも使える