Seu problema é que o conteúdo da sua variável arr está sendo substituído a cada iteração:o arr[k]
substitui tudo o que já está lá.A variável arr precisa ser local para o bloco:
mat = []
2.times do # avoid for... use iterators instead
row = []
2.times do
row << rand.to_s
end
mat << row
end