Você está muito quase lá.
E, por acaso, a questão não é sobre como fazer isso, mas sim sobre como obter bash para interpretar variáveis e passá-las adiante.
Você tem:
for fi in *.htm; do php -r '$f=@fopen("$fi", "r");echo html_entity_decode(fread($f, 20000));fclose($f);';done
Que tem aspas simples, com aspas duplas no interior.
As aspas simples não são interpoladas dentro do bash, mas as aspas duplas são ... então, se você alterá-lo para:
for fi in *.htm; do php -r "\$f=@fopen(\"$fi\",'r');echo html_entity_decode(fread(\$f, 20000));fclose(\$f);"; done
Como agora estamos usando aspas duplas, também precisamos escapar dos $ signs, caso contrário o bash acha que são variáveis interpoláveis e as substitui.