Explanation
Working from the inside out, the EOMONTH function gets the last day of month of any date. To this result, we add 1, which results in the first day of the next month.
This date goes into WORKDAY function as the "start date", along with -1 for "days". The WORKDAY function automatically steps back 1 day, taking into account any weekends. The result is the last workday of the month.
Holidays
To get the last working day of the month, taking into account holidays, just add the range that contains holiday dates to the formula like this:
=WORKDAY(EOMONTH(B4,0)+1,-1,holidays)
Custom weekends
The WEEKDAY function assumes weekends are Saturday and Sunday. If you need to customize weekend days, you can use the WEEKDAY.INTL function.