This code violates "queries inside loops," and "DML operations inside loops," and to be technical, also violates the mere concept of Ids, since you will never see an Id value within Apex Code that doesn't represent an actual record-- there's no reason to query the Id only to check to see if it exists (unless, of course, this Id comes from a user-supplied parameter or from an outside source that might possibly be out of sync). However, assuming you're talking about this class of problem in general (e.g. the field is a lookup to the parent), then you'd want to use another set:
Set<Id> assetsWithTags = new Set<Id>();
for(Asset_Tag__c record:[SELECT Asset__c FROM Asset_Tag__c WHERE Asset__c IN :rightOptionMap.keySet()]) {
assetsWithTags.add(record.Asset__c);
}
Asset_Tag__c[] newRecords = new Asset_Tag__c[0];
for(Id assetId: rightOptionMap.keySet()) {
if(!assetsWithTags.contains(assetId)) {
newRecords.add(new Asset_Tag__c(...));
}
}
insert newRecords;
There's other ways to accomplish this, as well, depending on if you need to know the tags' actual values, or you could just use an aggregate query, etc.