While using Vim's syntax engine for folding is very powerful and can be very convenient for syntax-aware folding, it's really hard to extend an existing syntax definition with new syntax, since creating new syntax matches and regions tends to affect how other syntax elements are recognized, so it tends to produce ripple effects on existing syntax, which seems to be what you've just experienced.
In cases like yours, it's probably much better to define folding separate from syntax, by using a different fold method.
One quick way to fold your
#pragma region is to use those expressions themselves as fold markers. There are a few limitations to that, such as the string will be matched anywhere in the line (not only in the beginning), it requires the whitespace to be exact (so it wouldn't recognize the word
pragma indented after a
# in the first column) and it won't match a word boundary at the end of the string.
But maybe that's good enough? If this pragmatic solution fits your needs, then all you need is:
setlocal foldmarker=#pragma\ region,#pragma\ endregion
A better solution is to use a function to implement a fold expression, in which case you can do a full string match using a regular expression to properly recognize all corner cases.
let l = getline(a:lnum)
if l =~# '^#\s*pragma\s\+region\>'
elseif l =~# '^#\s*pragma\s\+endregion\>'
:help fold-expr for details on the specific return values for this function. Note that the function is not limited to inspecting the specific line, or the specific line's contents only. You could write loops to find blank lines above or below it, look for other pragmas or directives and even check for syntax groups applied to characters in the current line (which can be really helpful to determine whether a specific region is inside of a comment, for instance.)
Hopefully you'll find these suggestions useful and a good solution to implement the desired folding without having to mess with the syntax rules.