With Rust-style interior mutability, any code accessing the value will see that it was mutated, but here the caller still sees a purely functional call, since the mutation is hidden.
I've heard the term "immutable facade" before for this type of thing (though granted, usually while talking about a class interface rather than standalone functions).