hidden_fc3_output will be the handle to the hook and the activation will be stored in activation['fc3'].
I’m not sure to understand the use case completely, but if you would like to pass this stored activation to fc4 and all following layers, you could create a switch in your forward method and pass it to the model. This would split the original forward path into two steps.
You could of course still use the forward hook if needed.
Have a look at this code snippet and let me know, if something would be useful or if I misunderstood your use case:
class MyModel(nn.Module):
    def __init__(self):
        super(MyModel, self).__init__()
        self.fc1 = nn.Linear(1, 1)
        self.fc2 = nn.Linear(1, 1)
        self.fc3 = nn.Linear(1, 1)
        self.fc4 = nn.Linear(1, 1)
        self.fc5 = nn.Linear(1, 1)
        self.fc6 = nn.Linear(1, 1)
        self.act = nn.ReLU()

    def forward_half1(self, x):
        x = self.act(self.fc1(x))
        x = self.act(self.fc2(x))
        x = self.act(self.fc3(x))
        return x
    
    def forward_half2(self, x):
        x = self.act(self.fc4(x))
        x = self.act(self.fc5(x))
        x = self.fc6(x)
        return x
    
    def forward(self, x, path='all'):
        if path=='all':
            x = self.forward_half1(x)
            x = self.forward_half2(x)
        elif path=='half1':
            x = self.forward_half1(x)
        elif path=='half2':
            x = self.forward_half2(x)
        else:
            raise NotImplementedError
        return x

            
model = MyModel()        
x = torch.randn(1, 1)        
out1 = model(x, path='half1')
out2 = model(out1, path='half2')
out = model(x)
print(out2 == out)

model.fc3.register_forward_hook(get_activation('fc3'))
out1 = model(x, path='half1')
print(out1 == activation['fc3'])
out2 = model(activation['fc3'], path='half2')
print(out2 == out)