いや、Monitorはcritical:を入れ子に出来ると謳っているのです。
> クラスコメントより
> 2) A monitor is reentrant, which means that the active process in a monitor does never get blocked when it enters a (nested) critical section of the same monitor.
元々そういう目的で紹介して頂いたはずですし。
で、確かに単純な入れ子なら問題無いように見えるのですが、1つのcritical:が複数の子critical:(孫ではなくて)を持っている場合に破綻しているように見受けられるわけです。


id:squeakerさんのコメントを受けて:
勿論実際にはこんな無意味なネストはしません。
単に関連部分だけを抜き出しただけです。
って何だか実際のコードをガツガツ出さないと結局通じない気がしますが。。。

monitor := Monitor new.
semaphore := Semaphore new.

[
	monitor critical: [
		semaphore signal.
		monitor critical: [].
		(Delay forSeconds: 1) wait.
	].
] fork.

[
	semaphore wait.
	monitor critical: [
		Transcript show: 'OK'.
	].
] fork.

このコードでは OK が即座に表示されます。
要するに、上のforkブロックの外側のcriticalブロック全体がcriticalに保護されるわけではないらしいのです。
内側のcriticalブロックが終了した時点で、もはや外側のcriticalさえも失効しています。
上のforkブロックの内側のcriticalをコメントアウトすると約1秒後に OK が表示されます。
これはそういう仕様というよりバグだという気がしているわけです。


っていうようなことを必死に訴えかけなくても、
数行追加するだけで修正出来たっぽいので良いんですけど。