Even though OPCServerConnected is made false upon disconnect, this variable isn't getting updated in time for the tread to see it. This is how I resolved the issue. If anyone can see a better way to do this, feel free to post your own answer.
Add this line just before the end of the thread: ThreadStopped()
In the base class, add the following:
Public m_AutoResetEvent As AutoResetEvent = New AutoResetEvent(False)
Protected Sub ThreadStopped()
m_AutoResetEvent.Set()
End Sub
Finally, in routines where disconnect is called for (Shutdown, Exit, Restart, etc.), add the following line before calling the OPC Server disconnect method:
m_AutoResetEvent.WaitOne()