郡司と申します。

質問の本質的な回答ではないのですが、

> h = {'1' => 1, '2' => 2, '3' => 3}
> h.each_key do |k|
>   p k
>   if k == '3'
>     h['4'] = 4
>   end
> end

であれば、

--
h = {'1' => 1, '2' => 2, '3' => 3}
h['4'] = 4 if h.has_key?('3')
--

と書くのはいかがでしょうか。

ある「構造を持ったデータ」に対して、「構造をループで解釈しながら
何かをする」と言う発想ではなく、「構造の外側から操作する」
という発想です。