You are correct in that fetching, then updating, and finally saving a single object is not very efficient. You can hold on to a reference of your currentUser object as long as you know which context to which it belongs. From there, your code will look something like this;
currentUser = //from somewhere else, a property perhaps
[MagicalRecord saveWithBlock:^(NSManagedObjectContext *localContext){
User *localUser = [currentUser MR_inContext:localContext];
localUser.lastChatMessageTime = [NSDate date];
}];
Fetching the object by object ID is going to be faster than performing a fetch request. However, since you're only changing one object, I would recommend just saving on the current thread (as long as the context is also on the correct thread):
NSManagedObjectContext *context = //....
User *currentUser = //from somewhere, and create in the context
currentUser.lastChatMessageTime = [NSDate date];
[context MR_saveToPersistentStoreAndWait];
This way there are no blocks to deal with, and you don't have to perform the save on a background queue since this single record update will likely be fast enough even on the main thread.