I don't think, this is a bug. The behavior is by design.
When you run the 1st cf, this function call is created (kind of simplified):
List( $$C; List( $$C; List( $$C; List( $$C; List( $$C; Let( $$C = ""; "(ended)" ) ) ) ) ) ) )
To calculate the 1st List function, FileMaker has to calculate the 2nd List function first. To calculate the 2nd List function, FileMaker has to calculate the 3rd List function first. And so on until FileMaker tries to calculate the 5th List function. But to calculate it, FileMaker has to calculate the Let function first. But here you already delete the global variable $$C. Therefore, when FileMaker finally is able to calculate the 5th List function $$C is already empty. The same happens with the 4th, 3rd, 2nd, and 1st List function.
Hmm, thanks for the explanation. So the reason the order of processing is different between concatenation and List() is that any function, List() included, has to calculate all of its contents first? I've been thinking of it as a shorthand for tidy concatenation, but I guess it's a function like any other.