как вообще понять, в каких случаях я получаю копию объекта, а в каких ссылку на него... допустим val foo = someMap[key] - я получу копию объекта?
Если вы туда ложили обьект, то и получите тот же обьект, если работаете с stdlib. Но, по факту, интерфейс этого не гарантирует и сторонние коллекции могут сделать как захотят.