In C++, I can define an accessor member function that returns the value of (or reference to) a private data member, such that the caller cannot modify that private
You haven't overlooked anything. There is no way in pure Java to do so. There might be libraries which provide some subset of this using annotations, but I don't know any offhand.
The way you pass back a reference to immutable data is to make the class you pass back immutable, plain and simple. There are a couple of library functions to help you produce an immutable view of some data in some very limited but common cases. Here's one example:
private List internalData;
public List getSomeList() {
return Collections.unmodifiableList(internalData);
}