Al di là del fatto che questo tipo di applicazioni è molto dubbio (solitamente si usa per creare applicazioni malevole), direi che stai sbagliando approccio: il deleteOnExit() è un'indicazione che viene data alla JVM di cancellare un determinato file alla chiusura. E' ovvio che tale file non deve essere impegnato da qualcun altro per poter essere cancellato. Ora, il fatto che tu abbia un EXE in esecuzione significa che è il sistema operativo che lo tiene impegnato. Se anche questo EXE fosse un wrapper per un'applicazione Java, quel che accade è questo:
codice:
L'utente avvia l'EXE
--> Sistema operativo apre l'eseguibile
--> l'EXE avvia la JVM
--> la JVM fa il suo lavoro
--> Termina la JVM (che tenta di cancellare l'EXE, ma è ancora in esecuzione!)
--> Termina l'EXE
--> Il sistema operativo rilascia le risorse del EXE.
Come vedi, la JVM non ha modo di cancellare il file poichè è quel file che l'ha avviata e che quindi è in esecuzione (impegnato) sul sistema operativo.
Dovresti, comunque, spiegare perchè vuoi cancellare l'EXE che avvia l'applicazione.
Ciao.