1. Лучше явно прописывайте {JOIN_TYPE} JOIN
2. Не используйте сокращения типа "b" Никогда. В один прекрасный момент попадете на запрос с join таблицы самой себя и полей эдак на 20 штук, помянете мое слово))
3. Лучше не пишите select *, пишите явно, что хотите получить.
SELECT books.id,
books.name AS book_name,
GROUP_CONCAT(genres.name) AS genres
FROM books_has_genres
INNER JOIN books ON books_has_genres.book_id = books.id
INNER JOIN genres ON books_has_genres.genre_id = genres.id
WHERE books_has_genres.genre_id = 25
AND books_has_genres.book_id NOT IN (
SELECT sub_books_has_genres.book_id
FROM books_has_genres AS sub_books_has_genres
WHERE sub_books_has_genres.genre_id = 22
)
GROUP BY books_has_genres.book_id
ORDER BY books.id