Why does a comparison between CITEXT and TEXT fail?
Do I really need to cast these columns to CITEXT to get comparisons to work?


Yes, that's what you have to do. That's not how the operator works. You're supposed to set this type on the table so you do not have to this. If one says it's case insensitive text, and the other says it's case-sensitive text, the case-sensitive text wins. The reason why the first example works is because 

SELECT * FROM citext_test WHERE value = 'One';


is essentially the same as 

SELECT * FROM citext_test WHERE value = 'One'::unknown;


Internally, that gets promoted by the operator to citext. You can disambiguate with the cast,

SELECT * FROM citext_test WHERE value = 'One'::citext;


or the functional form,

SELECT * FROM citext_test WHERE citext_eq(value, 'One');


But the apropos solution would be to ALTER TABLE for the table you're joining to and set its type to citext too.