Existe uma camada extra de cotação ausente. Em sed & tem um significado especial na substituição (significa a string correspondente). Então, para inserir um literal & você escaparia dele uma vez, e para inserir um literal \& , você escaparia da barra invertida ( \ ) e do e comercial ( \& ), mesmo para a barra invertida antes de% código%. Isso te dá:
#!/bin/bash
dothis(){
rootpass="${1//\$/\\$}"
rootpass="${rootpass//&/\\\&}"
echo $rootpass
sed -i "s/root/$rootpass/g" test.txt
}
dothis 'my&rootpa$$';