for some reason your function didn't work for me. I changed it a bit to get it working here and changed basically two things:
1) As we are using recursion there is no need for an explicit loop inside the function. The iteration is done using the consecutive calls to the function.
2) I get rid of the HH:MM:SS of the startDate in order to compare with the dates on the Holiday table. Otherwise the comparison would be like '2005-11-07 16:41:03' = '2005-11-07 00:00:00', which would evaluate to FALSE.
Below is the code with the changes.
create function fnGetNextBusinessDay (@startDate smalldatetime)
returns smalldatetime as
Declare @nextBusDay smalldatetime
Declare @weekDay tinyInt
set @nextBusDay = convert(datetime,left(convert(varchar,@startDate + 1,120),10),120) -- first get the raw next day
SET @weekDay =((@@dateFirst+datePart(dw,@nextBusDay)-2) % 7) + 1
if @weekDay in (6, 7) or exists (select 1 from holiday where holidayDate = @nextBusDay)
set @nextBusDay = dbo.fnGetNextBusinessDay(@nextBusDay)