while não é um comando, é uma palavra-chave do shell. As palavras-chave são reconhecidas antes que a expansão da variável aconteça, portanto, após a expansão, é tarde demais.
Você tem várias opções:
-
Não use uma variável.
while true ; do echo Evil Message; sleep 10; done & -
Use
evalpara executar o shell sobre o valor expandido da variáveleval "$cmd" & -
Invoca um shell para executar o loop
bash -c "$cmd" & -
Use uma função (normalmente usada para armazenar código):
cmd() { while true ; do echo Evil Message; sleep 10; done; } cmd &