If you don't find anything else, you could use simple arithmetic and logic.
For any month, there are no more than 7 possible mappings of day-of-month to weekday. That is, any month can start on any of the 7 days of the week. For example, January can start on Sunday, Monday, Tuesday, etc. Thus, there are only 7 possible dates in January that could match "third Monday in January".
The same is true for every month, and no month is longer than 31 days. So if you had an archetypal "month" of 31 days, and then make a prototype "month" for each possible starting day-of-week, you'll have 7 prototype "months" you can use to calculate with. Then you just ask NSCalendar what day of the week is the first of the month for the year of interest, and this selects one of the 7 prototypes. You then do the calculations on that month, keeping track of the actual days in the real month (i.e. if the real month is Feb, then there's never a Feb 30 or 31, even though your prototype month has 31 days).
It's not really necessary to have "month" objects, since the calculations basically involve base-7 calculations and modular addition. Base-7 because the "tens place" in a base-7 number represents the number of weeks, and the "units place" represents the day of the week. If the month starts on Sunday, that's a base-7 value of 00. If it starts on Monday, that's a base-7 value of 01. So you then add 21(base-7) to the starting day of the month, and convert to binary to get the date. 21(base-7) represents Monday (day 1) of the third week (20). It's not 31, because 30 in base-7 is the start of the fourth group of 7, not the third.
I hope that's not too confusing. It's been years since I had to do anything for this calculation, and it's probably written in something like 6800 assembly language or Forth, assuming I could even find it again (line-printer listing or 8-inch floppy disk).