Вот простое решение ruby, поскольку вы запросили ruby 2.1.4
str_arr = ["a", "b", "c", "d"]
h = {"a"=>{"b"=>{"c"=>{"d"=>123}}}}
x = 456
update_nested_hash(h, str_arr, x)
print h # {"b"=>{"c"=>{"d"=>456}}}}
def update_nested_hash(h, str_arr, x)
a = str_arr.shift
return h[a] = x if str_arr.empty?
h[a][update_nested_hash(h[a], str_arr, x)]
end