Eu encontrei uma maneira de fazer isso. Eu adicionei o seguinte ao arquivo plist.
Em vez de
<key>KeepAlive</key>
<true/>
Eu fiz isso
<key>KeepAlive</key>
<dict>
<key>SuccessfulExit</key>
<false/>
</dict>
Apenas definir KeepAlive como false interferiria no início do job. (Era presumivelmente esperando para ser chamado por alguém.) Mas o status do KeepAlive também pode ser determinado em tempo de execução. Este serviço agora reinicia automaticamente quando sai sem um bom motivo (ou seja, quando é eliminado), mas não quando sai por um motivo (ou seja, foi desligado regularmente). Isso é o que eu preciso.