What you are trying to do here is a "CrossTab" Query.
IMO - the best approach is to create a View (or temporary Table) that crosstabs the UserProfile/ProfileDefinition Table - then use this temporary table in a Join with the other table(s).
This is quite a complex problem to solve - but if you investigate (google) Crosstab or Pivots this should take you in the right direction.
Alternatively - create a user function that evaluates the Select Sub Query for you - and returns the value - this will avoid all the subqueries (eg GetProfileProperty(UserID, PropertyName) ).