Just filling in a blank here, but "luci/gae"'s memcache-backed datastore algorithm is based on "qedus/nds" and, consequently, also provides these guarantees :)
As noted, the most cost-optimal way of doing this appears to be running a memcache-only "Get" without falling through to the underlying datastore, followed by a keys-only query if memcache returns negative. I don't think there is an API for "check memcache but not real datastore" in "qedus/nds". In "luci/gae" it could be implemented as a special-case GetMulti filter underneath of memcache. Either would probably be trivial to add.
Speed-optimally, also as noted, performing a Get is best. At a low level, all AppEngine requests are converted to protobuf. The
GetRequest protobuf doesn't appear to include provisions to instruct it to not return the data, so I think you're out of luck with respect to not incurring cost.
However, since you are using a memcache layer here, is this really a problem? If most "Get" requests either hit a hot cache object or fail with "does not exist", only the case of entities that exist but aren't in memcache will incur a cost. If this is uncommon, using memcache-backed Get or equivalent is probably the best course here.