A solução simples aqui é usar algum tipo de comunicação entre processos para informar ao processo de destino para fazer a mudança. Por exemplo, você pode usar sinais:
#!/bin/sh
export x=true
start() {
trap x=false USR1
while [ $x = "true" ]; do
echo running...
sleep 1
done
}
start &
sleep 5
kill -USR1 $!
wait
produz esta saída:
$ ./testit.sh
running...
running...
running...
running...
running...
$