As expected, it was very simple. F.dropout doesn’t disable dropout for eval mode. From stackoverflow:

Both are completely equivalent in terms of applying dropout and even though the differences in usage are not that big, there are some reasons to favour the nn.Dropout over nn.functional.dropout:
Dropout is designed to be only applied during training, so when doing predictions or evaluation of the model you want dropout to be turned off.
The dropout module nn.Dropout conveniently handles this and shuts dropout off as soon as your model enters evaluation mode, while the functional dropout does not care about the evaluation / prediction mode.

Code update:
class Demo(nn.Module):
    def __init__(self):
        super(Demo, self).__init__()
        self.agefc1 = nn.Linear(2, 20)
        self.agefc2 = nn.Linear(20, 1)
        self.drop_layer = nn.Dropout(p = .5)

    def forward(self, demo_in):        
        demo_in = self.agefc1(demo_in)
        demo_in = F.relu(self.drop_layer(demo_in))
        demo_in = self.agefc2(demo_in)
        demo_in = self.drop_layer(demo_in)

        return demo_in