The problem you have is that the IIF is really a form of metadata but is stored as literal data in the table. You are attempting to cross a barrier that is there for a reason.
Table lookups are supposed to return ONLY data (recordsets). They are supposed to be pretty much unconditional. To store an IIF in a table is going to be a pain in the toches because there is no valid context in which that IIF can execute. The barrier I mentioned earlier has to do with the Access expectation of what a table contains. It is a design barrier that if you have an "IIF" inside a field, it is simple text when in recordset context and there is no reasonable way for the table-based recordset to know that it has anything to evaluate. Essentially, in a table, there IS NOT (CANNOT BE) anything deferred or computed.
Query evaluation is by its nature a slower process and is very different. If it takes a little while to evaluate that query, it is kind of "expected behavior." If there is a function or something else in a given QUERY field (not the underlying table field), SQL will try to evaluate it. The catch here is that crossing that data/meta-data interface is considered a violation of good programming practices. You see, it presumes that the contained data in that function-field hasn't been compromised. One mistake and suddenly you killed everything that depended on that single datum. You introduced a single point of failure in your code. Which where I work is grounds for dismissal if you do it too often.
OK, having explained why it is risky and having given other appropriate admonitions, here are a couple of ways to approach the issue. Both suffer from the same exact failing: There is no function/data checking here. Either it works or it blows up right away due to bad data in the targeted field.
1. Edit your "IIF" statement in the appropriate table. Then dynamically build your queries using the string stored in that table plus whatever else you needed to include in the query's recordset. Then and only then execute the dynamic query. Or store the query, which will cause it to be evaluated for optimization when you store it. You would of course have to eliminate older copies with the same name or generate a unique name. The former is tricky and requires strict adherence to a programming convention on the name. The latter risks running out of database objects if you aren't careful. Not to mention making everything run slower when it has to search the database's object list to find the query you wanted to run.
2. Have your queries include the field as a reference the "EVAL" function (which you can look up in Access help). EVAL( [fieldname] ) will evaluate any expression (without the leading equals-sign) in the database field if that expression returns either a text string or a numeric value. You will get back a VARIANT data type when you use this function, so VBA code based on that field in your query would have to know to receive a VARIANT or do a typecast. If there is a problem with the field, you won't know it because Access cannot check on this expression with the same attention associated with other query expressions.
Design-wise, you probably need to make this query a JOIN of the contents of that single table where you store the IIF with the table to which it applies. That might represent yet another can of worms, but if you have to do some fishing around, maybe that is what you need anyway.
Be it herein noted that this is "playing with fire" and could very well cause you to get burned. You have been warned.