Try a Normal Map like:
:noremap tc /{<CR>v%:s/\v%V<(\w)(\w*)>%V/\=toupper( submatch(1) ) . tolower( submatch(2) )/g<CR>/}<CR>
How does it work?
/{<CR> :: Searches an opening curly brace.
v% :: Visual select the content from current position (opening curly brace) until the closing one.
:s/.../g<CR> :: Substitute command that inside visual selection(%V) title-case words doing two groups, the first letter and the rest.
/}<CR> :: After substitution command, if cursor comes from a different line its position is set at the beginning of line, so to avoid repeat the map against same text, set its position after closing curly brace to find next pair in following execution.
I did a test with following text:
Topic One ========= This is some text about topic one. It has {multiple paragraphs.} more more mroe Topic Two ========= This {is some text about topic} two. It {has only one} paragraph.
And executing tc command in Normal Mode three times, it yields:
Topic One ========= This is some text about topic one. It has {Multiple Paragraphs.} more more mroe Topic Two ========= This {Is Some Text About Topic} two. It {Has Only One} paragraph.