What you're trying to do is a recursive match. As I have already stated on my comment, there are similar answers to questions that might work for you (if adapted) here and here.
For your case, I adapted this answer for your situation, resulting in the following RegEx:
(?=(\{(?>[^{}]+|(?1))+\}))
I replaced the parenthesis (of the previous solution) for curly brackets and then enclosed the entire capturing group in a positive lookahead. Since lookarounds don't consume any characters, the engine will keep trying to match the string. Additionally, if you include the assertion in the lookahead inside a capturing group, the expression will be "matched" (but not consumed) and you'll be able to retrieve it from the capturing groups. This way, it's possble to match your pattern multiple times, giving you the expected results.
Regex101 demo: https://regex101.com/r/nsypuX/1/