One approach is to: assuming A and B want to talk. A can first encrypt the originial message M with A's private key and B's pubkey, the result is E(A,B,M). Then further encrypt E(AB,M) to E(AC,E(AB,M)) and send to C, which is a normal nostr pubkey owned by the relay. The relay will decrypt the message and find the receiver and forward to B. C is not capable of seeing the message.
Of course, C, the relay will know that A and B are talking. But the public can't trace this information.
The implementation is very easy. I will implement this in blowater.deno.dev if any relay is willing to implement it.