Вы пытаетесь заменить один символ ('a') несколькими символами (1,2,3,4,5,6,7,8,9,10). PHP не может понять это и пытается преобразовать этот массив в строку. Когда вы используете строку в качестве параметра $ search, вы также должны использовать строку в качестве параметра $ replace. Массив как параметр $ replace можно использовать только тогда, когда $ search также является массивом. Цитирование из документации:
Если поиск и замена являются массивами, то str_replace () берет значение из каждого массива и использует их для поиска и замены по теме. Если замена имеет меньше значений, чем поиск, тогда для остальных значений замены используется пустая строка. Если поиск - это массив, а замена - это строка, то эта замещающая строка используется для каждого значения поиска. Однако обратное не имеет смысла.
Вот код, который будет работать:
$str = 'a b a ba a';
$count = 1;
while(($letter_pos = strpos($str, 'a')) !== false) {
$str = substr_replace($str, $count++, $letter_pos, 1);
}