Во первых, ".*" - жадный поиск, то есть в него попадет и "onclick" и ">". Но даже если заменить ".*" на ".*?", то условие "(?!onclick)" всё равно будет "съедаться" точкой (иначе было бы, если вместо условия было выражение ".*?onclick").
Я тоже не слишком разбираюсь в регулярных выражениях, но вот, вроде, рабочий вариант:
<a ((?!onclick).)*?>
Хотя выглядит криво как-то. Наверняка можно сделать изящнее.
Вообще лучше убрать отрицание из регуляторки и переложить в код. В зависимости от языка, могут быть разные способы сделать это, но самый очевидный и рабочий везде - сначала найти все якоря, а после исключить якоря с "onclick". Что-то вроде:
data.findall("<a .*?>").replace("<a .*?onclick.*?>", "")