4 of 7 added 55 characters in body

Jelly, 50 40 bytes

®“œṣ⁾“F”jЀFvµÐL
“()“{}“[]“<>”©ẋ"FŒ!QÇÐḟ

Plain and inefficient.

Try it online! (times out at TIO for [1,1,1,1] - yes, inefficient.)

How?

®“œṣ⁾“F”jЀFvµÐL - Link 1: recursive reduction: string s
             µÐL - loop until no change:
®                - recal from register: ["()", "{}", "[]", "<>"]
 “œṣ⁾“F”         - literal ["œṣ⁾", "F"]
         Ѐ      - map:
        j        -   join: [["œṣ⁾","()","F"],["œṣ⁾","{}","F"],["œṣ⁾","[]","F"],["œṣ⁾","<>","F"]]
           F     - flatten: "œṣ⁾()Fœṣ⁾{}Fœṣ⁾[]Fœṣ⁾<>F"
            v    - evaluate as Jelly code with input s
                 -   œṣ     - split on sublists     }
                 -     ⁾..  - literal char-pair     } for each of the four possible
                 -        F - flatten               }

“()“{}“[]“<>”©ẋ"FŒ!QÇÐḟ - Main link: list: [n(), n{}, n[], n<>]
“()“{}“[]“<>”           - literal ["()", "{}", "[]", "<>"]
             ©          - copy to register
               "        - zip with:
              ẋ         -   repeat list
                F       - flatten
                 Œ!     - all permutations (yeah, it's inefficient!)
                   Q    - de-duplicate
                     Ðḟ - filter discard if:
                    Ç   -   call last link (1) as a monad (non-empty is truthy, while empty is falsey)