Carrying over the SOL would have quite a high performance cost. Since the function can go on to modify the SOL, but then has to be able to restore the state when the function returns, the SOL lists must be copied before the function is called. If you have picked say 1000 instances with some event before calling a function, then every time the function is called with "carry SOL" it must duplicate an array with 1000 items. Used naively (on-by-default, or if there is a checkbox and you just get in to the habit of always checking it) you could end up with a very high CPU cost for this feature.
Passing a UID and picking it in the function is a good technique: the "pick by UID" condition works in constant time (it just directly picks the instance without having to check every instance like normal conditions) so this is an efficient pattern. If you need multiple instances, just putting the picking conditions back in the function is probably not much less efficient than any kind of "carry SOL" feature, and could actually be more efficient since you can make sure you don't carry the SOL for any unrelated objects the function doesn't actually need.
Functions are generally supposed to be some kind of independent, re-usable bit of work, and I'm not entirely convinced how sensible it is to design them to use the SOL of the caller, since that seems to mix together the responsibilities of the calling event and the function. There's not really a way it "should" work, since programming languages don't use SOLs so there's no good analogy looking at traditional programming languages. This type of question is, as far as I'm aware, totally unique to C2.