Let's break down the regex vs the actual match so you can see why it matches:
(<Properties>).+?%%.+?%%.+?(<\/Properties>)
(<Properties>) matches the first <Properties>.
.+? matches one or more characters until it encounters %%, thus matching <Property>TEXT</Property><Properties><Property >.
%% matches %%.
.+? matches one or more characters until it encounters %%, thus matching TEXT.
%% matches %%.
.+? matches one or more characters until it encounters </Properties> thus matching </Property.
(<\/Properties>) matches </Properties>.
Instead you want to make your regex more explicit:
(?:[^<%]|%(?!%)|<(?!\/Properties>))
The above will match one character that is not < or %, if it is one of those two it will only match % if not followed by another % and it will only match < if not followed by /Properties>. This should be used as replacement for your .. Resulting in:
(<Properties>)(?:[^<%]|%(?!%)|<(?!\/Properties>))+%%(?:[^<%]|%(?!%)|<(?!\/Properties>))+%%(?:[^<%]|%(?!%)|<(?!\/Properties>))+(<\/Properties>)
Since the regex is more explicit I can remove the lazy ? quantifier modifier safely.