So your code is theoretically equivalent to using the ThreadPool(4).map from multiprocessing library. The test code is as follows:
import torch as t
from multiprocessing.pool import ThreadPool
from utils.helper_classes import Timer

def test(t):
    print("RPC called")
    for i in range(100000):
        t2 = t*1.000001
    return t2

def test1():
    tm = Timer()
    ts=t.Tensor([1,2])
    tm.begin()
    for i in range(4):
        test(ts)
    print(tm.end())

def test2():
    tm = Timer()
    ts = t.Tensor([1,2])
    pool = ThreadPool(4)
    tm.begin()
    pool.map(test, (ts, ts, ts, ts))
    print(tm.end())

And my test result is:
test1: 2.091 s
test2: 2.404 s
You can dispatch sub processes in the rpc call to work around the GIL.