Have you looked at Immer.js? It allows you to express modifications to immutable objects as a series of imperative operations.
In my experience most "immutability" in JS is enforced by convention or, at best, static type systems. It's not ideal, but it works.