You don't need a subquery here. Use this query instead:
SELECT p.*, ol.prod_id olpid
FROM products p LEFT JOIN orderlines ol
ON p.prod_id = ol.prod_id
WHERE ol.prod_id IS NULL
ORDER BY category, prod_id;
Your initial query takes a longer time to execute because you are using a subquery. The subquery needs to be executed entirely, then the WHERE condition may be applied, and at the end the records are ordered. This is also the reason why your query with EXPLAIN is slow.