This is because of the way salesforce loads custom labels. we had the same problem since we had a survey framework where questions were loaded from metadata and so we did the concatenation on the client side.
Salesforce loads all the labels as part of markup or controller when it loads the component to UI, in this case since the label is coming dynamically it makes a async call to get the label and thats why you dont see the dynamic label in UI.
Any time you put in the markup you will see its value
$A.get(labelReference) must be able to resolve the label reference at compile time, so that the label values can be sent to the client along with the component definition.
If the label is already known on the client, $A.get() displays the label. If the value is not known, an empty string is displayed in production mode, or a placeholder value showing the label key is displayed in debug mode.
Using $A.get()with a label that can't be determined at runtime means that dynamicLabel is an empty string, and won’t be updated to the retrieved value. Since the label, "$Label.c." + day, is dynamically generated, the framework can’t parse it or send it to the client when the component is requested.
There are a few alternative approaches to using $A.get() so that you can work with dynamically generated labels.
// hints to ensure labels are preloaded
If your code dynamically generates many labels, this approach doesn’t scale well.
If you don’t want to add comment hints for all the potential labels, the alternative is to use $A.getReference(). This approach comes with the added cost of a server trip to retrieve the label value.