Porque lidar com isso no caso geral seria muito complicado. Basta considerar o seguinte exemplo:
Um programa lê um arquivo linha por linha e produz cada linha duas vezes. Agora, para que isso funcione sem um segundo arquivo (ou seja, no mesmo arquivo), o programa precisaria armazenar em buffer a maioria (todas) das linhas que ele ler, já que elas serão sobrescritas antes de serem lidas.
Para manter os assuntos, os programas simples geralmente usam um arquivo secundário e temporário, que eles movem sobre o original assim que terminam. É por exemplo como funciona sed -i
(inline).