The problem with a single JSON object as the input is simple: your first .* is greedy. So it consumes everything until the last { that is still followed by a }. If you made that .* ungreedy (or left it out), you should get the full JSON object:
String pattern = ".*?(\\{.*\\}).*";
But you can (and should) leave out the beginning and trailing repetitions completely:
String pattern = "\\{.*\\}";
Then you don't even need to capture anything. Note that this has to be used with find instead of matches.
However, your input has multiple JSON objects. And this is where you get problems with regular expressions. Some engines support constructs that allow correct nesting of brackets (to check which ones actually belong together). But those regexes can easily get ugly and not maintainable.
You are better off, walking the string manually, and keeping count of the current nesting level. Whenever you get back to the top-level you just cut off a substring (from the corresponding opening bracket to your current position).
"A"...?