Ruby, 99 89 102 bytes
->y,m{(1..4).find{|d|(A=Date.new y,m,-d).wday<5}
A.strftime"%A %d#{A.day>30?'st':'th'}"}
require'time'
Explanation
Anonymous function tacking year and month as numbers.
We find which of the last 4 days of month ( checking backwards using -d ) are wdays (week days 0-indexed) less than 5 saving each time date object in constant A for later use.
When it's found loop is stopped so A is the last weekday of the month.
Then we format the output, we can only have 31th31st or xxstXXth.