To answer your first question I removed the unneccessary code (loss etc) to get a minimum example. You could simply calculate the fc outputs one after the other (as multiprocessing on GPUs can be hard to implement) and later on return a dictionary (or a list or whatever you want).
class ResNet50(nn.Module):
    def __init__(self,num_classes,num_fcs=3, loss={'xent'},**kwargs):
        super(ResNet50,self).__init__()
        self.loss = loss
        resnet50 = torchvision.models.resnet50(pretrained=True)
        self.base= nn.Sequential(*list(resnet50.children())[:-2])
        self.num_fcs = num_fcs
        for i in range(num_fcs):
            setattr(self, "fc%d" % i, nn.Linear(2048, num_classes))


    def forward(self,x):
        x = self.base(x)
        x = F.avg_pool2d(x,x.size()[2:])
        f = x.view(x.size(0),-1)

        clf_outputs = {}
        for i in range(self.num_fcs):
            clf_outputs["fc%d" % i] = getattr(self, "fc%d" % i)(f)

        return clf_outputs


For your second question you could simply try it like this:
# create class instance
model = ResNet50(5)

# freeze layer (can be done with every fc layer)
model.fc0.train(False)