Half solved!
David Gladstein pointed out that GHCI's "it" variable can at least sometimes solve the problem:
Prelude System.IO> let x = 3
Prelude System.IO> x
3
Prelude System.IO> let x = it + 1
Prelude System.IO> x
4
Then I discovered that in GHCI one can bind monadically:
Prelude> x <- return 3
Prelude> x <- return $ x + 1
Prelude> x
4
Prelude> x <- getLine
This line was user input, not computer output.
Prelude> x
"This line was user input, not computer output."
Prelude>
I don't remember seeing anyone demonstrate it; perhaps it is deprecated.
I would still very much like to know whether and if so how it is possible to let the user evaluate arbitrary haskell when running compiled code.