Quando o ano atinge o ano atual, ele nunca é incrementado novamente (o elif está em vigor), portanto, o loop while externo que testa "menor que ou igual a" ainda está em vigor. Coloque let year++ após o loop while na parte elif e ele funcionará. Ou melhor ainda ... chame break explicitamente nesse ponto. Nunca é bom confiar no loop while para terminar sozinho.
Além disso, você pode simplesmente usar sequências e pular todos os testes desajeitados:
#initialization as before
let lastyear=currentyear-1
for year in $(seq $year $lastyear); do
#do stuff with $year
done
#now months of the current year
for month in $(seq $incmonth $crntmnth); do
#do stuff with $month and $currentyear
done
Seu loop duplo era inútil de qualquer maneira - o ano atual acontece apenas uma vez.