List<Int> tells a consumer which operations are available through that reference. It does not promise that the underlying collection will stay unchanged.
Suppose a caller creates val owned = mutableListOf(2, 4) and passes it to a function accepting List<Int>. The caller later adds 6 to owned. If the consumer retained that same object, the read-only interface did not establish an earlier snapshot. val fixes the reference held by owned, not the list's contents.
For a function that needs the values as they were when passed, I would specify where a separate copy is made and who keeps it from later modification. For one that deliberately reads the caller's current list, keeping the shared object may be enough. Where would you establish the snapshot if that is the actual requirement?