Supondo que o valor de FOO seja um nome de variável válido (digamos BAR ), eval \$$FOO divide o valor de BAR em palavras separadas, trata cada palavra como um padrão curinga e executa a primeira palavra de o resultado como um comando, passando as outras palavras como argumentos. A barra invertida na frente do dólar faz com que seja tratado literalmente, então o argumento passado para o eval builtin é a string de quatro caracteres $BAR .
${${FOO}} é um erro de sintaxe. Não faz uma “substituição dupla” porque não existe tal recurso em nenhum dos shells comuns (não com esta sintaxe de qualquer maneira). Em zsh, ${${FOO}} é válido e é uma substituição dupla, mas comporta-se diferentemente do que você gostaria: ele realiza duas transformações sucessivas no valor de FOO , sendo que ambas são transformação de identidade, por isso é apenas uma maneira elegante de escrever ${FOO} .
Se você quiser tratar o valor de uma variável como uma variável, tome cuidado para citá-las corretamente. É muito mais fácil se você definir o resultado para uma variável:
eval "value=\${$FOO}"