What should do of empty string (`DO ""`) do?

Well, seems the worry was for naught, because...

DO Won't Take Strings Without a Rebol [...] Header.

>> do ""
** Error: IMPORT and DO require a header on: <source>

Moreover, DO of a BLOCK! is targeted to not mean "run this block of code in the evaluator".

That will be handled by EVAL/EVALUATE, which won't accept strings.

If you have a string that represents code, and you don't want to combine that code with a header saying how it should be LOAD-ed... you have to TRANSCODE and bind it yourself. Which is now not that hard to do, really... you can run code right where it stands.

outer: 10

string: "outer + inner + arg"

demo: func [arg] [
    let inner: 20
    let code: inside [] (transcode string)
    print ["The result is" eval code]
]

>> demo 30
The result is 60

That might actually be useful. As it is, DO of strings in R3-Alpha was basically useless... unless you were trying to DO a script you got from somewhere else (like, maybe a script stored in a database or something). In which case you will be covered by the DO because you will have the header you need.