gRPC provides asynchronous C++ client API that uses CompletionQueue to fetch responses. For similar asynchronous behavior it is also possible to use synchronous gRPC API and launch each call in it's own thread, e.g. by using std::async.
Some common problems attributed to use of threads are
writing thread safe code is more difficult
starting threads has some overhead
But to me it looks like gRPC async client needs thread anyway for reading CompletionQueue (it's blocking), and overhead of starting thread is very small compared to overhead of RPC to another process or computer.
If asynchronous behavior is required, what are benefits of "real" asynchronous gRPC API compared to running synchronous calls in threads?