O arquivo ".class" é o que chamamos de bytecode, ou seja, é o seu código compilado. Não vou mentir, não sei os detalhes em específico da resposta, mas posso imaginar o motivo.
De forma semelhante, em python, outra linguagem de programação, as vezes, quando rodamos o código, geramos arquivos ".pyc" que são código compilado de python na linguagem C.
A vantagem do código compilado é que ele roda naturalmente mais rápido que qualquer código interpretado, e o python em questão faz isso na sua primeira execução para que quaisquer outras vezes que você for rodar o código, o código compilado rode e o desempenho seja melhor.
No seu caso, eu imagino que a chamada de "java HelloWorld.java" fez a compilação do código em tempo-real por debaixo dos panos, e você somente não percebeu isso. O comando "javac" é usado especificamente para compilar código. O comando "java" para rodar aplicações java. Muito provavelmente, caso na hora de rodar essa aplicação o código não esteja compilado, o comando em si deve chamar o javac, criar o bytecode e rodar. O ".class" não apareceu porque foi descartado ao fim da execução.
Se esse é realmente o caso, o uso do javac é imprescindível. Se você tiver que compilar seu código a cada execução, mesmo sem mudanças no código em si, o tempo que isso poderia levar, principalmente em caso de códigos grandes, que podem levar horas para compilar, seria insuportável.