At some point in time, the benefit of storing strings as integers is going to get trumped by the cost of looking up the actual string values in the dictionary.
Those dictionaries live at the part level and have to be recreated all the time during merges, so that could slow things down too.
I've seen LowCardinality used efficiently with 300k values - but of course it all depends on your unique data and environment.