There's an older post on this forum that talks about how HTML tables encode Values (and I say the word 'Value' in context of the HTML Table's two custom columns: (1) Header and (2) Value).
It's my assumption that the developers intended the values to be a one-for-one (i.e. straight text) translation. For example, if a value was "<no value entered>", they would not want Flow to inadvertantly default to trying to translate that into HTML--the net result would be trying to translate that into an HTML tag when it really shouldn't.
So what ends up happening is that they take the text in the Value field and convert the characters that may have HTML carryover and encode those characters. For example, quote becomes """ (without the quote-symbols), greater than (">") becomes ">", less than ("<") becomes "<", and strangely enough... ampersand becomes ("&"). As you can see, the pattern for these encoding is [ampersand][code][semicolon]. If you want to see what I'm talking about, create a variable and set the value to your HTML table--then you can see what your actual HTML table looks like.
The workaround is to Compose your HTML table and replace the encoded values with their true values. Doing this has potential for consequences (mentioned above); but if you don't anticipate receiving values in brackets or quotes, then this workaround should work fine.
You can see some great examples of this in the link I referenced above provided by @DougL .