Both queries you posted will give you the correct user_ids.
If the combination (user_id, feature_id) is not unique, then the outer join may give you more duplicate rows. I doubt that's a problem for you, since the first approach may produce duplicates also, just not so many of them.
If you're really interested in why the outer join is faster, generate and post the epxlain plan results, as mentioned in the forum FAQ: https://forums.oracle.com/message/9362003
I suspect that user_id is indexed, and is failry selective; that is, out of, say, 3,000,000 rows in the table, you might have 1,000,000 distinct values of user_id. If that's the case, then every time you find a row with an X, you only have to join an average of 3 other rows. If you do an IN sub-query, You're saying it will produce a list of about 650,000 user_ids, and that will be unindexed, so searching for a given id in that list will be much slower than 3 indexed fetches.