Yah,ignore my last remark. That was dumb.
The issue is allocate-code-object on gencgc.
Here's a 100% reliable way to hang the system. Usually it prints I=1, I=2, then stops.

(defun busybee (&aux (rs (make-random-state)))
  (declare (notinline make-array))
  (loop repeat 100
        do (do-all-symbols (s)
             (declare (ignore s))
             (if (zerop (random 2 rs))
                 (make-array '(256))
                 (sb-c:allocate-code-object 5 100)))))

(defun hangme ()
  (let ((i 0))
    (loop
      (print (incf i))
      (let ((t1 (sb-thread:make-thread #'busybee))
            (t2 (sb-thread:make-thread #'busybee)))
        (let ((r1 (print (sb-thread:join-thread t1)))
              (r2 (print (sb-thread:join-thread t2))))
          r1 r2)))))