O loop externo que você tem é basicamente
for i in {1..10}; do
some_compound_command &
done
Isso iniciaria dez instâncias simultâneas some_compound_commandem segundo plano. Eles serão iniciados o mais rápido possível, mas não totalmente "todos ao mesmo tempo" (ou seja, se some_compound_commanddemorar muito pouco, o primeiro poderá terminar antes do início do último).
O fato some_compound_commandde ser um loop não é importante. Isso significa que o código que você mostra está correto , pois as iterações do jloop interno serão executadas seqüencialmente, mas todas as instâncias do loop interno (uma por iteração do loop externo i) serão iniciadas simultaneamente.
A única coisa a ter em mente é que cada trabalho em segundo plano será executado em um subshell. Isso significa que as alterações feitas no ambiente (por exemplo, modificações nos valores das variáveis do shell, alterações do diretório de trabalho atual com cd, etc.) em uma instância do loop interno não serão visíveis fora desse trabalho em segundo plano específico.
O que você pode querer adicionar é uma waitdeclaração após o loop, apenas para aguardar a conclusão de todos os trabalhos em segundo plano, pelo menos antes do término do script:
for i in {1..10}; do
for j in {1..10}; do
run_command "$i" "$j"
done &
done
wait