Ответ
Нет, copy-on-write не свойство всех value type.
Снаружи это всё равно value type: правка одной копии не меняет другую. Данные копируют не при присваивании, а в момент изменения, и только если ими ещё пользуется другая переменная.
По умолчанию механизм есть у таких типов:
Array,ContiguousArray,Dictionary,Set,StringArraySlice,SubstringData,AttributedString
Обычный struct копирует поля сразу. Copy-on-write у него нужно делать самому, т.е. class в куче и isKnownUniquelyReferenced перед записью.