Slow query performance due to temporary file?
work_mem
Obviously, the sort operation spills to disk:

Sort Method: external merge  Disk: 36224kB


More work_mem can help the query, like @Kassandry already suggested. Increase the setting until you see Memory instead of Disk in the EXPLAIN output. But it's probably a bad idea to increase the general setting based on one query. Proper setting depends on available RAM and your complete situation. Start by reading in the Postgres Wiki.
To just fix your query, set work_mem high enough for your transaction only with SET LOCAL in the same transaction.
BEGIN;

SET LOCAL work_mem = '45MB';

SELECT ...

COMMIT;   -- or ROLLBACK

You probably need a bit more than 40 MB. In-memory representation is a bit bigger than on-disk representation. Related:

Configuration parameter work_mem in PostgreSQL on Linux

Query
Your query (after trimming some noise):
SELECT * 
FROM   products
WHERE  status &gt; 100
AND    above_revenue_average  -- boolean can be used directly
AND    category_id &lt;&gt; 5
ORDER  BY start_date DESC;

Your rows are half a kilobyte wide (width=524). Do you need to return all columns? (Typically, you don't.) Only list columns in the SELECT list which you need from your query to improve overall performance, especially since you have work_mem issues already.
Can any of the involved columns be NULL? Particularly important for category_id and start_date. You might want to adapt in that case ...
Index
A multicolumn index can certainly help performance. (Like @Paul outlined). You have to weigh cost and gain. If performance for this query is important or it is very common, go for it. Don't create a special index for every query. As few as possible, as many as necessary. Indexes are more powerful when shared, that increases chances that more of them stay in cache.
A boolean column like above_revenue_average is a typical candidate for a condition in a partial index rather than for an index column.

Unexpected Seq Scan when doing query against boolean with value NULL

My wild guess based on incomplete information:
CREATE INDEX prod_special_idx ON products (start_date DESC)
WHERE  above_revenue_average
AND    status &gt; 100
AND    category_id &lt;&gt; 5;

Use DESC NULLS LAST in index and query if start_date can be NULL.

PostgreSQL sort by datetime asc, null first?