Substitute() will only work for characters actually contained within your text. In this case, your text presumably doesn't contain the ";" character itself, as this is inserted automatically by Appian whenever rendering an array into plaintext. I'm not sure what your current code is so it's hard to guess at exactly what the best solution might be, but you will probably want to use a looping function or at least something that specifically deals with arrays.
The easiest is "joinArray()", which allows you to automatically concat together all items in the passed-in array, separated by whatever character you designate.
joinArray(
pv!myCdtArray.description,
" "
)
For more advanced use cases, you should iterate over the array using a!forEach(), as this allows you to do item-by-item processing when necessary.
a!forEach(
items: pv!myCdtArray,
expression: fv!item.description & if(fv!isLast, null(), " ")
)
/* the above is functionally identical to joinArray(), but is easy to expand to handle other use cases which joinArray() cannot */