Как заменить строку на цифры у оператора IN?
Цифры тут как раз совершенно не обязательны, а вот знаков вопроса должно быть больше. На каждый айди. 
ПХП не джинн из бутылки, чтобы отгадывать, что тут имелось в виду - целиком строка или отдельные значения.
Если нужны отдельные значения, то и передавать их надо по отдельности, n'est pas?

Это конечно не так красиво выглядит, но других вариантов все равно нет

$array = [8,10,11]; 
$in  = str_repeat('?,', count($array) - 1) . '?';
$sql = "SELECT * FROM users WHERE id NOT IN ($in)";
$stmt  = $db->prepare($sql);
$stmt->execute($array);
Если передаваемый параметр - это CSV идентификаторов, то следует использовать
SELECT *
FROM `users`
WHERE FIND_IN_SET(id, ?);

Примечание 1. CSV не должен содержать никаких паразитных пробелов (а то любят всякие "украшатели" понатыкать пробелов после запятой).
Примечание 2. Такой запрос - гарантированный фуллскан. Зато не будет инъекции.

PS. В принципе этот CSV несложно довести до состояния JSON array (всего-то две скобки добавить) - тогда можно применить JSON_CONTAINS(), что может быть немного быстрее. А уж если переданный JSON распарсить на отдельные значения с помощью JSON_TABLE(), так ещё и от фуллскана избавимся (правда, версия сервера нужна достаточно свежая).