Your problem is that y and z are not known in the context that actually compiles the string into a block. You'd probably be better off with something like this:
h := '[ :y :z | x := y + z]'.
(BlockClosure readFromString: h) value: 3 value: 4.
Although I suspect that code probably won't work either - because x hasn't been declared anywhere, so a more correct version would be:
h := '[ :y :z | y + z]'.
x := (BlockClosure readFromString: h) value: 3 value: 4.
I don't think there's any real way you can make a String representation of a block act like a true closure in the context it's parsed, since it just won't have access to the variables - and would fail to compile.