C# server handles responses "asynchronously" in the sense that the method stubs you need to implement are meant to be implemented as async methods. So you can write "synchronous code", but you shouldn't really block in your code (although starting from v1.6.0 this will work too).
Multiple request can be handled at once (and you don't need any sychronization to make that safe) and your handlers' code will run on a threadpool. You might of course need synchronization in your business logic, but that's a different question.
Channels are definitely thread safe are there are meant to be used to invoke muliple calls (channel creation is expensive compared to call creation).