Minecraft target selector select by built-in tag | e.g. Inventory item with tag "wool"

The reason that your NBT checks don't work is because the id tag stores only the exact ID. The NBT processor does not know or care about any item tags that the item may belong to, all it notices is that your provided string (#minecraft:wool) does not match the actual value that's there (minecraft:white_wool).

The NBT checks don't have access to data pack tags. This means that the only way to accomplish your task is to test for each individual ID, or use a predicate, which requires a data pack:

{
    "condition": "entity_properties",
    "entity": "this",
    "predicate": {
        "equipment": {
            "mainhand": {
                "tag": "minecraft:wool"
            }
        }
    }
}

As I always say, a data pack is not unusual. In fact, it is actually becoming a new normal for writing commands and other actions, and command blocks are dwindling in use. So you should really become used to creating data packs, because they are much wider in terms of what you can do.