Oddly enough, I don't recall knowing that UNBIND even existed - so maybe my life can be easier. It's an interesting question. When are the bindings of returned words and blocks important? What should be "best practice"? I worry that doing Unbind/deep before returning will create collateral damage to bindings not part of the function's mission.
In thinking about the main thrust of your question I realised I'm not entirely clear on what a frame actually is. I have read Relative Binding and FRAME! Internals. Is there some documentation that defines FRAME! at a Rebol language level?
A FRAME! is much like an OBJECT!, but it is the context a function gets when it starts running. So if you ask for BINDING OF an argument/refinement/local of a function, this is the answer you will get. (R3-Alpha would just give you TRUE to say that such words in a function were bound, it had no object-like thing to interact with.)
You can also make a frame for an ACTION! explicitly. If you fill in all its required arguments, or refinements with TRUE and then the refinement arguments, you can DO it:
>> f: make frame! append/
>> f.series: copy [a b c]
>> f.value: 'd
>> eval f
== [a b c d]
>> eval f
== [a b c d d]
One important issue about FRAME! is that the "object-ness" of it appears on-demand. This is to keep from creating an entity the GC has to worry about on each and every function call. But once user code asks for a frame or gets its hands on it, then the GC has a little stub it has to track.