Assumindo que a matriz esteja correta:
echo '['
printf '{"%s": "%s"},\n' "${arr[@]}" | sed '$s/,$//'
echo ']'
O comando sed
remove a vírgula do final da última linha.
Em seguida, passe isso para jq
para formatá-lo corretamente:
{
echo '['
printf '{"%s": "%s"},\n' "${arr[@]}" | sed '$s/,$//'
echo ']'
} | jq .
Com os dados fornecidos, isso produz
[
{
"key1": "foo"
},
{
"key2": "bar"
}
]
Isso obviamente tratará todos os valores como strings, que também são o que eles estão no shell.