Vc não está usando locale diretamente, mas indiretamente está sim.
Como eu já disse antes, sempre consulte a documentação. No caso de String.format, a documentação diz:
The locale always used is the one returned by Locale.getDefault(Locale.Category) with FORMAT category specified.
Ou seja, ele usa o locale default que está configurado na sua JVM. Para ver qual é, basta fazer algo como:
System.out.println(Locale.getDefault(Locale.Category.FORMAT));
No meu caso, o resultado foi pt_BR (que corresponde a “português do Brasil”), por isso ele usa a vírgula como separador decimal.
Se vc quer forçar um separador específico, não tem jeito, tem que especificar um locale. Por exemplo, se eu mudar para um locale em inglês:
resposta = String.format(Locale.ENGLISH, "o resultado é %.2f", produto);
Agora ele vai usar o ponto como separador decimal, pois eu forcei um locale específico.