How are you writing the documents to Couchbase? Are you upserting one document at a time using blocking methods? I wonder if you would see better performance if you could batch the documents into a tumbling window and upsert each window using async upserts.
Alternatively, I wonder if you could combine the query and the update into a single N1QL statement. I’m not a N1QL guru so I don’t know what that statement would look like… just putting the idea out there.