You could try simplifying and using `LATERAL` for joining the `laps` table:

    SELECT 
      races.*, tmptimers.last_start_time, tmplaps. last_updated_at
    FROM 
      races
    LEFT JOIN 
      timers AS tmptimers 
        ON  tmptimers.user_id = 1 
        AND tmptimers.race_id = races.id
    LEFT JOIN LATERAL
      ( SELECT 
          updated_at AS last_updated_at
        FROM 
          laps 
        WHERE 
          user_id = 148
          AND updated_at > '2014-06-13'
          AND race_id = races.id
        ORDER BY 
          updated_at DESC
        LIMIT 1
     ) AS tmplaps
         ON TRUE  
    WHERE
      races.account_id = 5
      AND races.id IN (29, 30, ..., 74)
    ORDER BY
      last_updated_at DESC ;

I'm not sure what index will be best for the `laps` table though. Perhaps an index on `(user_id, race_id, updated_at)`. I tested a similar query on [SQL-Fiddle][1] and it used the index. The plan showed:

>  Index Only Scan Backward using "index_name" on laps

[1]: http://sqlfiddle.com/#!15/75ef5/1