SOQL queries are inherently single-object. You are correct that there is no way to implement this requirement as written without using iteration.
However, this requirement itself is rather suspect. If you have a need to perform the same query across multiple objects, you should at least evaluating using SOSL rather than SOQL.
If you simply need to perform multiple unrelated queries across distinct objects, it's not clear what you gain by centralizing that query activity in a single generic method using Dynamic SOQL. It is clear, however, what you lose by doing so:
- Compile-time checking of fields and query syntax.
- Static dependencies between your code and schema, ensuring that the Metadata API can check those relationships at deployment time.
- The ability to use Apex binds in your queries.
- The ability to use Selector-layer classes on a per-object basis.
- You may have more difficulty tracking where you need to sanitize user input to avoid SOQL injection.
- If you use any kind of static analyzer, it's going to complain about the SOQL in a loop.
I would push back strongly on adopting this implementation pattern.