Sorry, you're right -- I should have researched the history and behavior of CreateDataProperty and DefineOwnProperty. And, in fact, it does appear that they will not replace an exisiting object property. Given that, it seems like you have no choice other than to use ForceSet (until CreateDataProperty and DefineOwnProperty are fixed?).
While I guess ForceSet was a little uncool in that it allowed replacing even non-configurable (v8::DontDelete) properties, IMO CreateDataProperty and DefineOwnProperty seem to go too far in the other direction.
Just out of curiosity, were your examples of read and print used for simplicity or are these really the functions you're lazily instantiating? If the latter, is an accessor really that much cheaper to set up then just adding the function right away as an object property? I can definitely see using lazy instantiation for a function if it's a constructor and comes along with a bunch of other stuff but if it's just a simple function, I would think the FunctionTemplate::New()->GetFunction() isn't going to be noticably slower than SetAccessor. Of course, you might be doing tricky stuff like dynamically loading the functions or maybe compiling JavaScript callbacks with your function or whatever, in which case lazy instantiation would make perfect sense.