LIMIT 1 after ORDER BY is just fine to get a single winner:
SELECT a.id, count(*) AS num
FROM  (
   SELECT requester_id AS id FROM requestaccepted
   UNION ALL
   SELECT accepter_id  AS id FROM requestaccepted
   ) a
GROUP  BY a.id
ORDER  BY num DESC
LIMIT  1;
You get an arbitrary pick if there are multiple winners. You might add additional ORDER BY expressions to get a deterministic pick.
If you must avoid LIMIT / FETCH FIRST (really?) the window function row_number() is a (more expensive!) alternative:
SELECT id, num
FROM  (
   SELECT a.id, count(*) AS num
        , row_number() OVER (ORDER BY count(*) DESC) AS rn
   FROM  (
      SELECT requester_id AS id FROM requestaccepted
      UNION ALL
      SELECT accepter_id  AS id FROM requestaccepted
      ) a
   GROUP BY a.id
   ) sub
WHERE  rn = 1;
To get all IDs that tie for the win, just add WITH TIES. Must use standard SQL syntax FETCH  FIRST 1 ROWS instead of the Postgres shortcut LIMIT 1 to add the clause.
SELECT a.id, count(*) AS num
FROM  (
   SELECT requester_id AS id FROM requestaccepted
   UNION ALL
   SELECT accepter_id  AS id FROM requestaccepted
   ) a
GROUP  BY a.id
ORDER  BY count(*) DESC
FETCH  FIRST 1 ROWS WITH TIES;
No additional ORDER BY expressions, that would resolve ties.
If you must avoid LIMIT / FETCH FIRST (really?) the window function rank() is a (more expensive!) alternative:
SELECT id, num
FROM  (
   SELECT a.id, count(*) AS num
       , rank() OVER (ORDER BY count(*) DESC) AS rnk
   FROM  (
      SELECT requester_id AS id FROM requestaccepted
      UNION ALL
      SELECT accepter_id  AS id FROM requestaccepted
      ) a
   GROUP  BY a.id
   ) sub
WHERE  rnk = 1
ORDER  BY id; -- optional
db<>fiddle here - with extended test case to show a tie
See: