The short answer is no.
I am at home and find myself without my current project files (plus no ACAD), otherwise I'd post a function, but it seems you already know how to do it by AttributeCollection using ObjectIDs, so my code probably wouldn't help you anyway.
I don't know of any way (in the Managed .NET API) to get an AttributeReference by Tag. Wether you go through the objects in the block reference or get the AttributeCollection, you are still working with ObjectIDs not Entities.
The only thing you can do to speed it up (if you didn't already) is to make sure as soon as you find your attref, you stop looping (as Tony mentioned). And to keep it clean, make sure that however you terminate your loop, you get all your open references disposed.
I guess there is one more thing, based on some of the posts here, you are looking for more than one attref in the same block, if so, you can find them all in one loop through the attref collection if you pass in a dictionary (of string, string) where the key is the Tag and the value is the new Textstring. I have a function for that (at work) if you want.
Dave O.