Great explanation. Your explanation is straightforward, so just proceed and code it as you say it. No complications, not even AJAX, nothing. Wrapping your brain around it is what makes it appear more difficult than it is.
I will give you a few tips to get you started. First of all, what you call a database table isn't actually one. Add an extra column to the table, a primary key. For example, apptID, of integer type, 1, 2, 3, ..., etc., giving each appointment a unique ID.
Then continue as follows:
<cfif isDefined("form.dateField")><!--- If user has selected a date, then store it so that it is available in his session --->
<cfset session.selectedDate = form.dateField>
<cfelse>
<cfset session.selectedDate = "">
</cfif>
<cfif NOT isDefined("application.getDates")> <!--- No dates are available --->
<cfquery name="application.getDates"><!--- Get distinct dates and store them in application scope --->
/* select distinct apptDate as availableDate */
</cfquery>
<cfelse> <!--- Dates are available --->
<cfoutput>
<form action="#CGI.SCRIPT_NAME#" method="post" name="f1" id="f1">
<select name="dateField">
<option value="">Select Appointment Date<option>
<cfloop query="#application.getDates#"><!--- List dates as dropdown options--->
<option value="#availableDate#" <cfif session.selectedDate EQ availableDate>selected</cfif>>#availableDate#<option>
</cfloop>
</select>
<br>
<input name="sbmt1" type="submit" value="Submit appointment date">
</cfform>
</cfoutput>
</cfif>
<cfif session.selectedDate IS NOT "">
<cfquery name="session.getTimes">
/* select apptTime as availableTime where apptDate = '#session.selectedDate#' */
</cfquery>
<form action="#CGI.SCRIPT_NAME#" method="post" name="f2" id="f2">
<select name="timeField">
<option value="">Select Appointment Time<option>
<cfloop query="#application.getTimes#"><!--- List times as dropdown options--->
<option value="#availableTime#">#availableTime#<option>
</cfloop>
</select>
<br>
<input name="sbmt2" type="submit" value="Submit time of appointment">
</cfform>
</cfoutput>
</cfif>