浜地です。

> あ、理由はぱっと見よくわからないのですが、
> そのパッチを当てると TestIO#test_read_error が
> 止まらなくなったように思います。

おそらく after_fork のあとに作った timer thread が
すぐ終わっちゃってるからみたいです。
なかださんのパッチプラス下記みたいなのでどうでしょうか。
手元ではとりあえず test-all は test_delegate 以外は通ってます。

Index: thread.c
===================================================================
--- thread.c    (revision 20287)
+++ thread.c    (working copy)
@@ -2371,6 +2371,7 @@
 void
 rb_thread_start_timer_thread(void)
 {
+    system_working = 1;
     rb_thread_create_timer_thread();
 }