The strange thing is that your select statement does not even return columns with the name specified in the result set that you appeared. In addition, I noticed that you are repeating the day '2012-10-02' at your request.
SELECT IF(start <= '2012-10-01' AND '2012-10-01' < end, 'OCCUPIED','EMPTY') AS '2012-10-01', IF(start <= '2012-10-02' AND '2012-10-02' < end, 'OCCUPIED','EMPTY') AS '2012-10-02', IF(start <= '2012-10-03' AND '2012-10-03' < end, 'OCCUPIED','EMPTY') AS '2012-10-03' FROM Venue as v, Event as e WHERE e.venue_id = v.venue_id GROUP BY v.venue
EDIT:
Both events below have the same venue and venue, and your request is grouped by venue, so it suppresses the OCCUPIED result on the day '2012-10-03'.
event_id | start | end | venue_id 1 | 2012-10-01 | 2012-10-02 | 1 2 | 2012-10-03 | 2012-10-04 | 1
SQL FIDDLE: http://sqlfiddle.com/#!2/dc33f/20
You can try adding an aggregate function like MAX to get any OCCUPIED event contained in a subset of records:
SELECT e.*, v.venue, max(IF(start <= '2012-10-01' AND '2012-10-01' < end, 'OCCUPIED','EMPTY')) AS '2012-10-01', max(IF(start <= '2012-10-02' AND '2012-10-02' < end, 'OCCUPIED','EMPTY')) AS '2012-10-02', max(IF(start <= '2012-10-03' AND '2012-10-03' < end, 'OCCUPIED','EMPTY')) AS '2012-10-03' from event e, venue v where e.venue_id = v.venue_id GROUP BY v.venue
SQL FIDDLE: http://sqlfiddle.com/#!2/dc33f/22