Também é possível fazer uma deep copy usando JSON.stringfye depois JSON.parse, não sei se é a forma mais correta, mais sempre que preciso faço dessa forma.
Respondendo a "O spread também cria uma shallow copy: In JavaS..." dentro da publicação Lidando com objectos em JS - Parte 1
1
1
O problema é que JSON.stringify dá erro se o objeto tiver referências circulares. Embora seja possível contornar, usar structuredClone me parece mais direto do que gerar uma string e depois fazer parse nela. Aliás, tem vários benchmarks mostrando que usar JSON pra isso é mais ineficiente (embora para poucos objetos pequenos não deva fazer diferença).
Outra vantagem de structuredClone é que funciona com vários tipos que JSON não suporta, como Date e RegExp, entre outros (embora também seja possível contornar, exemplo).