Loading the state_dict does not change the requires_grad attribute of the model parameters and they will keep their old value:
model = nn.Linear(1, 1)
for name, param in model.named_parameters():
    print(name, param.requires_grad)
> weight True
bias True

sd = model.state_dict()
model.load_state_dict(sd)
for name, param in model.named_parameters():
    print(name, param.requires_grad)
> weight True
bias True
    
for param in model.parameters():
    param.requires_grad = False
for name, param in model.named_parameters():
    print(name, param.requires_grad)
> weight False
bias False

model.load_state_dict(sd)
for name, param in model.named_parameters():
    print(name, param.requires_grad)
> weight False
bias False

Also, note that model.train() and model.eval() does not change the requires_grad attribute and thus does not freeze parameters.
It changes the behavior of some layers, such as dropout (which will be disabled during eval()) and batchnorm (which uses the running stats instead of the input batch stats).
To freeze/unfreeze parameters you would need to change the requires_grad attribute.