池澤といいます。

「要素のない配列の挙動」には何も罪はなく、「配列を2重にしたときの挙動」
に罪があるわけでもない。
真犯人は「xの指しているものは何か」という問題、ということでしょうか。

r = [[], []]
r.each do |x|
  if x.empty? <= ここでxはrの要素を指している
    x = [""] <=ここでxの指しているものは新しいオブジェクト[""]になった
  end
end

つまりもとのrは何も変わっていない。

たださんのヒントのように
x = [""]ではなく x << "" とやると、もとのrの要素が[]から[""]に変わる。

花岡さんのヒントのように
x.object_id をみればxの指しているオブジェクトが変化したことが分かる。

r.map! { |x| x.empty? ? [""] : x} などとやると
期待通りr は [[""], [""]] になります。

eachを使ってはまった感じっぽいですね。

という理解であっているでしょうか。
考えていて面白かったです。