Opa johnnys, tudo bem? Na verdade a gente também dá new na connection, mas esse não está tão explicito assim, a gente usa algo como mysql.createConnection, não é mesmo? E a partir dai, dá um return então temos:
return mysql.createConnection();
Esse createConnection é o nosso new, mas está de forma indireta.
No produtoDao, você não codificou dessa forma. Lembrando que como o MySQL é um pacote NPM, é na documentação do pacote que a gente vê como usa, lá não tem descrito que precisamos usar o new, em outros pacotes podem ter essa descrição de necessidade. (Express é um exemplo).
No produtoDao, por ser uma classe nossa e que não escrevemos outras maneiras de criar os objetos, então a gente tem que escrever o new manualmente.
Lembrando que, para criação de objetos, a gente usa o new sim, só que no caso de pacotes como o MySQL, o new talvez não esteja no nosso controle, mas sim no controle do próprio pacote em si, em algum lugar no código dele vai ter o new do objeto da conexão.
Entendeu mais ou menos a ideia?