exec faz o que diz: usa exec() . Ele não envolve um shell a menos que seja informado para ( -exec bash ... ), e se ele ainda ainda precisar de aspas simples para impedir que o shell interativo interprete as interpolações variáveis. (O shell não é mágico e não sabe que você pretendia que aqueles fossem interpolados por outra coisa.)
Por exemplo, quando você usa o seguinte comando:
find . -type f -exec echo $(file={}; echo ${file:0:5}) \;
seu shell primeiro executa a substituição do processo executando $(file={}; echo ${file:0:5}) , que simplesmente gera {} , então executa o comando final:
find . -type f -exec echo {} \;