Python 3, 74 62 58 4444 40 bytes
-12 bytes thanks to Erik the Outgolfer. -18 bytes thanks to Leaky Nun. -4 bytes thanks to musicman523.
Takes input as a bytestring.
lambda s:chr(min(*{*range(s[0],s[-1])}-{*s}))
Another cool solution:
lambda s:chr(min(*{*range(*s[::~-len(s)])}-{*s}))