This is an extremely basic question about Emacs Lisp, and it has nothing to do with strings or add-face-text-property specifically. You really should read through the Emacs Lisp Intro, which is a manual that teaches how to program in Emacs Lisp. It does not assume any prior knowledge of programming.
In Lisp, “returning” a value really means that the expression evaluates to that value. The code you pasted in your question has a lot of irrelevant details in it, and some mistakes. Let’s assume you have this code instead:
(let ((heading "some string")) (modify-string heading) (modify-string heading))
modify-string here represents any function which has side effects that modify the contents of the string we pass in. Currently this expression evaluates to nil, because the last thing it does is call modify-string, and modify-string returns nil. Essentially, this code starts with a string, modifies it twice, and then throws it away. How can we return the string instead? We need to add another expression to the body that will evaluate to the modified string. What is the simplest expression that evaluates to that string? Yes, the variable itself:
(let ((heading "some string")) (modify-string heading) (modify-string heading) heading)
This is not an uncommon pattern; you’ll see it fairly frequently in the Emacs Lisp code that you read.