SQL query to find all parent records where all child records have a given value (not just some)
I don't have a copy of PostgreSQL in front of me.  Does this compile in your version:

...
HAVING count(*) = (select count(*) from participatns as x where x.event_id = events.id)


An alternative approach would be to remove from this list of all events those which have a participant who's status is not 'present', using the EXCEPT clause:

select
    event.id
from events

EXCEPT

select
    event.id
from event
INNER JOIN participants 
ON participants.event_id = events.id 
WHERE (participants.status != present)


The EXCEPT syntax is usually more efficiently expressed as NOT EXISTS or as a LEFT JOIN with the child identifer ends up as null.  I'm sure you can re-factor the query to suit your needs.