This sounds quite similar to pure functional languages like Haskell, where a function call cannot have any side effect.
But those go further in that they don't even have any mutable data. Instead of
var foo = { a: 1 };
var bar = foo; // make a copy of foo
set bar.a = 2; // modify bar (makes a copy)
Haskell has foo = Baz { a = 1 }
bar = foo { a = 2 } // make a modified copy of foo