Por causa da ordem de avaliação das coisas, echo$i seria avaliado para a string echo1 (para i=1 ) após expansão do alias.
Para poder usar a string como um alias, você precisa reavaliar a string resultante:
for i in 1 2 3; do
eval "echo$i"
done
Se echo1 , echo2 e echo3 foram funções do shell , então o eval não foi necessário (testado no Bash 4.4).
Suas tentativas com bash -c não funcionarão, pois os aliases são locais para a sessão atual do shell.
Sua coisa inicial
echo{1..3}
resultaria em
echo1 echo2 echo3
Mesmo que echo1 tenha sido expandido para echo 1 , o resultado foi a saída da string
1 echo2 echo3
Pessoalmente, dependendo do que você queria que os aliases fizessem , eu teria implementado uma função:
dothing () {
printf '%s\n' "$@"
}
... e depois chamou isso com
dothing {1..3}
para produzir
1
2
3
Claro, isso teria sido alcançado com printf '%s\n' {1..3} diretamente ...