Se o programador que chamar o join souber que join deleta seria o mesmo que o caso do delete, isto é, o SO , o usuário que faz isso está ciente que depois de chamar join ele pode acessar lixo ao tentar acessar a Thread que já saiu (no caso da idéia utilizada).
Um exemplo similar é o caso do Boost que um acesso à Thread após o join é indefinido.
Obs:. O método join nao é chamado pelo SO (não constitui uma agressão direta a orientação à objetos), contudo seria necessário uma ótima documentação com exemplos nesse caso para o programador não confundir a semântica dada.