The difference between ValueProxy and EntityProxy is that ValueProxy-s do not have "identity". Two EntityProxy-s can be said to represent the same object if they share the same stableId(); that cannot be said for ValueProxy, where each instance is a distinct object. For instance, when you RequestContext#edit() a ValueProxy, you create a clone. Another difference: ValueProxy-s are compared equals() by their properties' values. Obviously, while EntityProxy sends diffs of the modified properties from the client to the server, ValueProxy-s are always sent as a whole: there's nothing to diff against.
You can use a Locator with a ValueProxy, it's just that only the create() method will ever be called (so all other methods: find(), getId(), getVersion(), etc. should probably throw an UnsupportedOperationException). If your server-side class has a zero-arg constructor, then you don't need a Locator: being proxied by a ValueProxy, the requirements are different that from EntityProxy-s: no need for a static findXxx method, or getId or getVersion instance methods.
Apart from that, it works just like EntityProxy-s.
You can also see ValueProxy-s like the objects you'd transfer using GWT-RPC: when you send an object from client to server, or from server to client, you're making a "copy", created from scratch (with EntityProxy on the other hand, the "base object" could be retrieved from your database before being modified; with ValueProxy, a new instance is created each time).
If you're moving from GWT-RPC, I'd start using ValueProxy so your methods calls have the same semantics as with GWT-RPC, then move to EntityProxy if you want/need it.