Olá Luan, tudo bem com você?
A proteção do Object.freeze é feita apenas na primeira camada, então quando fazemos: 
const negociacao = new Negociacao( new Date(), 30, 50);
negociacao._quantidade = 80
console.log(negociacao._quantidade);
Veremos que não conseguimos atribuir pois temos apenas uma variável de tipo primitivo , então a proteção é feita pois há apenas uma camada :)
Entretanto Date nos devolve um objeto, e dessa forma não conseguimos fazer uma proteção completa, se a nossa classe tiver algo parecido como:
    get data() {
        return this._data;
    }
Esse objeto _data não está totalmente protegido, vou te mostrar com o mesmo exemplo:
console.log(negociacao.data)
> Date Tue May 12 2020 11:19:54 GMT-0300 (Horário Padrão de Brasília)
Agora vou pegar o objeto do tipo data, que temos diversos métodos entre eles um para mudar o mês:
negociacao.data.setMonth(8);
console.log(negociacao.data)
> Date Sat Sep 12 2020 11:19:54 GMT-0300 (Horário Padrão de Brasília)
E veja que conseguimos mudar o mês de Maio para Setembro :)
Dessa forma conseguimos perceber que com objetos não temos toda essa imutabilidade, pois congelamos a primeira camada, se uma dessa camadas for um outro objeto, podemos alterar os dados tranquilamente, como é o caso do atributo Data :)
Quando fazemos igual o instrutor estamos tendo essa garantia de que ele pode alterar tranquilamente a data que não se refletira em nosso objeto!
Abraços e Bons Estudos!