Limit has no effect on aggregation
LIMIT is applied late in the query, after aggregation, so you get the complete first group.
You should apply the LIMIT in a lateral subquery:
SELECT users.*, p.action
FROM users
   CROSS JOIN LATERAL (SELECT permissions.action
                       FROM permissions
                       WHERE permissions.&quot;userId&quot; = users.id
                       ORDER BY permissions.id
                       LIMIT 1) AS p
WHERE users.id = 1;

And alternative is the non-standard DISTINCT ON:
SELECT DISTINCT ON (users.id)
       users.*, p.action
FROM users
   JOIN permissions AS p
      ON p.&quot;userId&quot; = users.id
WHERE users.id = 1;
ORDER BY users.id, permissions.id
LIMIT 1;