Вполне можете использовать, но не забывайте, что slice, что spread operator они делают копию только плоского объекта(массива).
const arr = [0, 1, [2,3]]
const newArr = arr. slice(0)
newArr[2][0] = 'new data'
console.log(arr[2][0]) // new data
Если вам нужно избегать мутации для глубокого объекта, то используется либо JSON.stringify, JSON.parse, либо сloneDeep из lodash. Или сами можете написать функцию обхода объекта.
Есть еще специализированные библиотеки immutable(deprecated) или immerjs.