Creating a view by comparing two fields of two different content types using the same taxonomy
This types of matching (list Taxonomy siblings) is usually done through Has Taxonomy term ID Contextual filter, but your case is a bit more indirect. 

You're not showing related content on other node pages. You want to list some content on User pages, but the matching is not done between the listed content and the user (because you don't have Taxonomy on users), it is one step more removed, you're matching content through the user "bridge" to other content. 

You need to go "the entity reference" way to achieve all the necessary matching and contextual filtering. 

First we list the user Offer nodes because they give context, they tell us which categories to look for. Once we have that we pull into Views Needs nodes that share the same category field values as those offers, and we additionally filter out that user Needs, in case they have any, because they're only interested in seeing other people's matching Needs. 


Create Page Display Views listing Offers! (filter Content type)
Change Path to user/%user/related-needs
Add Menu Tab (it will show on user profiles) 
Add Relationship Taxonomy term referenced from field_category from the Content Category, you can require it since they will all have it filled in 
Add a new Relationship Content using field_category from the Taxonomy term Category. 

This Relationship automatically uses the first Relationship. This is where the matching is done from all Offers nodes category back to all the nodes on the system using that same category. 

You have the Title field showing Offer nodes at this point. You can keep it this way just to test, but that field isn't our target since we want to see the list of Needs related to the Offers. Or if you don't need it: modify it according to the following step: 
Add another Title Field and make it use the second Relationship (it will be the only one available). This will show the nodes that share the same category taxonomy as the Offer node in that same views row. 

From now on, for every field you add, if you're not using a Relationship it will show Offer node data, and if you use the second Relationship it will show the data from nodes that share the same category as the Offer node from that row. This includes the Needs node we are after. 
Add Contextual filter Authored by from the Content Category and configure it:
Do not use a relationship
When the filter value is NOT available
Provide default value
User ID from route context
When the filter value IS available or a default is provided
Override title
Needs matching user {{ arguments.uid }} Offerings (check your argument token under Replacement patterns)
Specify validation criteria
User ID  

This Contextual filters out Offer nodes authored by the user whose profile is being viewed. 
Add another Contextual filter Authored by from the Content Category and configure it:
Relationship field_category (the second one)
When the filter value is NOT available
Provide default value
Raw value from URL
2
When the filter value IS available or a default is provided
Specify validation criteria
User ID
More
Exclude  

This Contextual filter excludes Needs nodes authored by the currently viewed user since it doesn't make sense to show these. This step isn't necessary if your users will never have Needs nodes that share the same category with their Offer nodes.  
Since you'll probably have duplicates in your results you can sort it out by turning Aggregation on. If you have Needs fields other than Title you may need to change their Aggregation settings from Entity ID to Target_id.   

Make sure you have all Sort Criteria removed since it interferes with Aggregation.  


Visit the user profile page and find the tab, and check that the results are as you'd expect. It seems like a complicated procedure but it makes sense once you understand what is happening in each step.