えーと、スタックオーバフローするけど、次は定義できる。
# let rec f x = g x + g x
and g x = f x;;
そして、g x = f x は、g = fun x -> f x の糖衣構文であることに注意する。
すると、f, g は共にラムダ抽象なので、評価が進まないことがわかる。

ところで、
# let rec f x = g x + g x
and g = f;;
は、g はこの時点ではラムダ抽象では*ない*(変数だと思え!)ので、この時点で
評価を進ませることが出来て、一歩進むと、
let rec f x = f x + f x
のようになり、あきらかに定義できない。(let rec x = 1 + x が定義できないように。)
このように、明らかに定義できない部分は蹴っている。

型ぐらいみろ、と思うかもしれないが、
f : 'a -> 'a は、f 1 とすると値だけど、f (fun x -> x) とすると、
ラムダ抽象。要するに、どっちも来うるので、安全側に倒しているのだろう。

私も良く分かっていませんが。