Você está esperando que o valor $PER seja redefinido para 50 para cada iteração do loop while externo, mas você não o redefine lá.
Eu também noto que você lê potencialmente muitos dados em uma única variável na parte superior do script.
Isso seria um pouco mais eficiente (assumindo bash ou ksh sintaxe):
cut -c 7-21 "Data.txt" |
while read -r code; do
if [[ ! -f "../FASTA_SEC/$code.fa" ]]; then
printf 'No such file: %s\n' "../FASTA_SEC/$code.fa"
continue
fi
for (( win = 2; win < 20; win += 2 )); do
printf 'The value of win is %d, now entereing inner loop\n' "$win"
for (( per = 50; per < 100; per += 2 )); do
printf 'Value of per is %d\n' "$per"
done
done
done
Isso evita a leitura na saída completa de cut em uma variável e, em vez disso, lê-a linha por linha.
Também evita os incômodos while loops.