Não é sobre a GUI, é especificamente sobre a estratégia de TextEdit
para salvar alterações: ele não escreve no lugar no arquivo existente, mas primeiro escreve um novo, e quando isso é concluído, remove o antigo um e renomeia o novo para os nomes do antigo. Muitos editores (programas que conceitualmente alteram um arquivo "in loco"), GUI ou não, usam essa estratégia para fins de segurança (você não perderá as versões novas e antigas se houver uma falha em um momento muito infeliz exatamente quando a escrita está ocorrendo), mas como você notou, "quebra" os hard links.
Um exemplo de um programa editor não interativo e não-GUI com esse comportamento é perl
com a opção de linha de comando -i
("edições locais") ...:
$ touch za.txt
$ ln za.txt zo.txt
$ echo ciao >za.txt
$ cat zo.txt
ciao
$ perl -i -p -e 's/a/b/' zo.txt
$ cat zo.txt
cibo
$ cat za.txt
ciao