It successfully redirects, loses one extra parameter, but keeps appending any of the remaining parameters.
RewriteCond %{REQUEST_URI} ^/wiki/index.php [NC]
RewriteCond %{QUERY_STRING} ^(.*)title=(.+)(&(.*)*)$ [NC]
RewriteRule (.*) http://www.example.com/kb/%2? [R=301,L]
Get that REQUEST_URI out of the condition and put it in the body of the rule where it belongs. It will save your server a load of work. I can't think of any situation where you'd want a
positive REQUEST_URI in a condition instead of in the rule itself. (Negative, yes, often.)
^(.*)title=(.+)(&(.*)*)$
Heavens, what complications. All you need is
RewriteCond %{QUERY_STRING} (?:^|&)title=([^&]*)
RewriteRule ^wiki/index.php http://www.example.com/kb/%1? [R=301,L]
If no-capture markup makes you anxious, leave off the ?: and revert to %2 in the target.
The reappended parameters were a big mystery at first glance, since your target ends in a ? the way it should. But it's an artifact of the wording of your condition:
title=(.+)(&(.*)*)$
Regular Expressions are greedy by nature. So if the original URL had more than one parameter after "title", only the last one will be dropped. In fact the result could be quite messy, because
/index.php?blahblah&title=something&name=somethingelse&hanky=panky&foobar=widget
work with me here would be redirected only to
/kb/something&name=somethingelse&hanky=panky
That's why you need to use [^&]* to capture only the "title" parameter. You don't need to say anything at all about what might come afterward, since you're just throwing that part away.
Edit: The (&(.*)*) makes no sense. I suspect what you were aiming for was
((&[^&]*)*)
but since you're not capturing for reuse, there's no need to include this part at all.