I’ve checked your update code and it seems to work:
class MyModel(nn.Module):
    def __init__(self):
        super(MyModel, self).__init__()
        self.conv1 = nn.Conv2d(3, 6, 3, 1, 1, bias=False)
        self.fc1 = nn.Linear(6*24*24, 5, bias=False)
        
    def forward(self, x):
        x = self.conv1(x)
        x = x.view(x.size(0), -1)
        x = self.fc1(x)
        return x

    def set_weight(self, scalar):
        self.conv1.weight.data.fill_(scalar)
        self.fc1.weight.data.fill_(scalar)

    def print_weights(self):
        print('Conv weight: {}\nLinear weigh;: {}'.format(
            self.conv1.weight, self.fc1.weight))
    
modelA = MyModel()
modelA.set_weight(0.)
modelA.print_weights()

modelB = MyModel() # First "pre-trained" model
modelB.set_weight(1.)
modelB.print_weights()

modelC = MyModel() # Second "pre-trained" model
modelC.set_weight(2.)
modelC.print_weights()

# Update conv part of model
model_dictA = modelA.state_dict()
model_dictB = modelB.state_dict()

# Filter
filter_state_dict = {}
for k, v in model_dictB.items():
    if 'conv' in k:
        filter_state_dict[k] = v

# Overwrite entries in existing model_dictA
model_dictA.update(filter_state_dict)
print(model_dictA)

# Load new state dict
modelA.load_state_dict(model_dictA)
modelA.print_weights()

# Re-update the second part
model_dictA = modelA.state_dict()
model_dictC = modelC.state_dict()

# Filter
filter_state_dict = {}
for k, v in model_dictC.items():
    if 'fc' in k:
        filter_state_dict[k] = v

# Overwrite entries in existing model_dictA
model_dictA.update(filter_state_dict)

# Load new state dict
modelA.load_state_dict(model_dictA)
modelA.print_weights()

# Run forward pass
x = torch.ones(1, 3, 24, 24)
output = modelA(x)

I cannot see any differences.
Could you explain a bit, what you mean by “it seems to start from scratch”?
Is the performance bad?
You are copying the weights from two different models, so I would assume the new model needs some training, because the different parts weren’t trained together.