A diferença é sutil; "$ *" cria um argumento, enquanto "$ @" se expande em argumentos separados, então:
LIST=(1 2 3)
for i in "${LIST[@]}"; do
echo "example.$i"
done
lidará com a lista (imprima-a) como múltiplas variáveis
mas
LIST=(1 2 3)
for i in "${LIST[*]}"; do
echo "example.$i"
done
lidará com a lista como uma variável.