The executor passed to withExecutor() is used for running callbacks on the response StreamObserver for async stubs. Since there isn't a callback for blocking stub, the executor is not used.
Regardless of blockingness of the stub, there are always network threads (e.g., Netty's EventLoopGroups) under the hood. If you want to configure that, use NettyChannelBuilder.eventLoopGroup().