read -s desativa o terminal echo apenas para a duração desse comando read . Então, se você digitar algo entre dois comandos read , o driver do terminal irá echo de volta.
Você deve desabilitar echo e, em seguida, chamar read em seu loop sem -s :
if [ -t 0 ]; then
saved=$(stty -g)
stty -echo
fi
while read -rN1; do
...
done
if [ -t 0 ]; then
stty "$saved"
fi