Your script doesn't stop after the second line because of how Bash handles errors in command substitutions. When you use $(...), if the command inside fails, Bash doesn't exit, even with set -e. So when false runs inside $(false), it fails, but the script keeps going.
The read a <<< $(false) line ends up assigning an empty string to a because $(false) produces nothing. That's why your script prints Hi there: ><, showing that a is empty.
You need a way to catch the failure of the command inside $(...). Since set -e doesn't catch it you have to check the command's exit status yourself. One way is to run the command first, check if it succeeded, and then assign its output.
So, to reliably detect if the command failed or just returned an empty string you should separate the command execution from the assignment. If the command fails your script can exit or handle the error properly.