Você deve gravar a saída em um arquivo temporário e renomear:
for i in ./*.gz
do
gunzip -c "$i" | head -8000 | gzip > "$i.tmp"
mv -f "$i.tmp" $(basename "$i")
done
Que sua versão às vezes funciona é se você tiver gunzip
de buffers suficientes durante a leitura.