Вы проверяете предварительный поиск только в конце совпадения, что означает, что он может сначала совпадать с максимально возможным количеством строки, а затем проверять предварительный поиск. Поскольку у вас нет [[
в конце строки, совпадение успешно.
Что вам нужно сделать, если вы действительно хотите использовать регулярные выражения, это проверить поиск для каждого добавляемого символа, например:
>>> s = 'hello world! [[A string typically used in programming examples]]'
>>> regex = re.compile('(?P<question>((?!\[\[).)+)')
>>> regex.match(s).group('question')
'hello world! '
Но учтите, что было бы намного проще просто использовать что-то вроде s.find('[[')
вместо регулярных выражений здесь.