I came across this question because I was trying to clear my 0.1% of doubt, but my opinion is that concatenation and set product are different notations of the same concept. Just like like subscripts and indices are just a different notation for functions (usually over discrete sets).
That said, set/cross product is a better notation when the sets have some operations that carry over to the product, for example by taking the direct sum of simple number fields with themselves you get a vector space. With concatenation notation it's a bit difficult to clearly denote the operations.
Example: Imagine having a one-time pad or carryless addition like operation on strings so that you can sum "cat" and "dog", then in set product notation "(cat,1) + (dog, 2) = (cat + dog, 1+2)" but in concatenation notation you get "cat1 + dog2 = cat+dog1+2" which doesn't make sense unless you allow something like parenthesis in the concatenation notation so that you can do "(cat+dog)(1+2)", which now is the same as the set product notation where ")(" is simply replaced with ",".
Note: carryless addition is indeed the direct sum of bitstrings with XOR as addition operation, so it can be done.
However, I wouldn't go as far as to say the direct sum is always a special case of set product.
Direct sum can be defined by property of the operations instead of by construction, you might then be able to find an example of direct sum that is not built on a set product, but the most common direct sums that you immediately think of is a set product together with a new operation.