Ma perche non hai passato il riferimento $2? la parte di str_replace č superflua. O mi sfugge qualcosa?
La regex va bene cosė com'č basta solo passare il riferimento giusto:

codice:
$word = 'testo [img=12143] testo testo [img=2345] testo [img=1001]';
$pattern = "/(\[img=(.*?)\])/";
$replace =  '[img].../immagine_$2[/img]';

$word=preg_replace($pattern,$replace,$word);
oppure togliere le parentesi esterne:
codice:
$word = 'testo [img=12143] testo testo [img=2345] testo [img=1001]';
$pattern = "/\[img=(.*?)\]/";
$replace =  '[img].../immagine_$1[/img]';

$word=preg_replace($pattern,$replace,$word);