In case anyone else is trying to do something similar, I've found the following works.
DocA.objects(id='abc', timestamp__lt=<timestamp>).update(upsert=True, **data)
If the object doesn't exist, it will be inserted. If it exists and the new timestamp is newer, it will be updated. If it exists and the new timestamp is older than what's already in MongoDB, it will return no match and thus try to create an new entry, which will raise NotUniqueError because the id already exists.