Que tal transformar a substituição de parâmetros no documento here off? (Veja Exemplo 19-7 em www.tldp.org para mais detalhes. )
Talvez o seu script fique melhor assim (embora ainda seja bastante denso):
su "$uname" -c "cat > ~/scripts/syncdownloads.sh << 'ENDMASTER'
###### Using '$()' to create a sub shell so that we don't have to escape
###### special characters.
$(
###### The parameter substitution is on here
cat <<INNERMASTER
#!/bin/bash
login="$flogin"
pass="$fpass"
host="$fhost"
remote_dir="$fremote_dir"
local_dir="$flocal_dir"
INNERMASTER
###### No parameter substitution
cat <<'INNERMASTER'
base_name="$(basename "$0")"
lock_file="/tmp/$base_name.lock"
trap "rm -f $lock_file exit 0" SIGINT SIGTERM
if [ -e "$lock_file" ]
then
echo "$base_name is running already."
exit
else
touch "$lock_file"
lftp -p 22 -u "$login","$pass" sftp://"$host" << EOF
set sftp:auto-confirm yes
set mirror:use-pget-n 5
mirror -c -P5 "$remote_dir" "$local_dir"
quit
EOF
rm -f "$lock_file"
trap - SIGINT SIGTERM
exit
fi
INNERMASTER
)
ENDMASTER"
Dessa forma, você não precisa escapar de nada.