Innanzitutto javac/java sono già "eseguibili", non c'è bisogno di passare per la shell di Windows (cmd.exe).

Poi comunque i tre stream standard-input/output/error del processo lanciato sono di per sé normalmente rediretti verso la applicazione Java. Questo vuol dire che se il processo lanciato fa output su output/error allora lato Java lo devi leggere. E se invece richiede input su standard-input, allora lato Java devi "pilotarlo" scrivendoci qualcosa tu.

Comunque da Java 7 ProcessBuilder ha una feature interessante: il metodo inheritIO() che permette di "ereditare" i tre stream dalla applicazione Java. Quindi se la tua applicazione Pb la lanci da una console, il processo lanciato userebbe quella console, senza dover andare a maneggiare direttamente gli stream.