If I store them in the same file - it only stores the state_dicts for each. It will not pickle the object.

This is not true. As long as you do not call state_dict(), it will save the whole variable. Please try the following.
For saving:
checkpoint = { 
    'epoch': epoch,
    'model': model,
    'optimizer': optimizer,
    'lr_sched': lr_sched}
torch.save(checkpoint, 'checkpoint.pth')

For loading:
checkpoint = torch.load('checkpoint.pth')
epoch = checkpoint['epoch']
model = checkpoint['model']
optimizer = checkpoint['optimizer']
lr_sched = checkpoint['lr_sched']

What’s the problem with this approach?