Потому что не выключен режим эмуляции.
Только фактически всё наоборот: при включенном режиме эмуляции PDO как раз таки
подставляет данные в запрос, и в LIMIT будет ошибка. А при выключенном данные в запрос не подставляются, и следовательно никакой ошибки не будет.
Судя по тому, что в вопросе нет сообщения об ошибке, при соединении вообще не указывается ни один нужный параметр.
Как правильно соединяться с PDO
При указанных настройках запрос с лимитом будет работать.
Идея с функцией query() отличная, только она не должна возвращать fetchAll(). Это все равно что добровольно отказаться от половины функциональности PDO!
Функция должна возвращать стейтмент. Тогда ее можно будет использовать для любых запросов ,и получать данные в любых из дюжины форматов, поддерживаемых PDO, а не только в виде тупого массива.
Соответственно, функция должна делать return $query; а код будет таким
$sql = 'SELECT * FROM vocabulary ORDER BY word_date DESC LIMIT :startLimit , :countLimit';
$params = ['startLimit' => $_POST['slimit'], 'countLimit' => $_POST['limit']];
$lines = $db->query($sql, $params)->fetchAll();
var_dump($lines);