If you have need to customize a template per record, then you would have to use the approach you use (there are other ways to optimize, but it would just be a work-around for the 1 template solution).
If you use the same template then you should only have to search for the placeholder text one in one string, rather than doing it for every row.
Here I have worked around your data structure. What you should do it create a templates table that you would join, or select from.
As I mentioned above, if some of the templates needed to be customized per (record?) then you could create an template override table. That would slow the whole thing down but if you only have 1% custom then it would slow things down by 0.9% ^_^
DECLARE @htmlTemplate NVARCHAR(MAX)
set @htmlTemplate = (select top 1 LayoutHTMLActual from EL)
UPDATE EL
SET LayoutHTMLActual=
REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(@htmlTemplate,'{TextID1}',ISNULL(EL.BodyText,'')),'{TextID2}',ISNULL(EL.BodyText2,'')),'{TextID3}',ISNULL(EL.BodyText3,'')),'{TextID4}',ISNULL(EL.BodyText4,'')),'{TextID5}',ISNULL(EL.BodyText5,'')),'{TextID6}',ISNULL(EL.BodyText6,'')),'{TextID7}',ISNULL(EL.BodyText7,'')),'{TextID8}',ISNULL(EL.BodyText8,'')),'{TextID9}',ISNULL(EL.BodyText9,'')),'{TextID10}',ISNULL(EL.BodyText10,'')),'{TextID11}',ISNULL(EL.BodyText11,'')),'{TextID12}',ISNULL(EL.BodyText12,'')),'{TextID13}',ISNULL(EL.BodyText13,'')),'{TextID14}',ISNULL(EL.BodyText14,'')) FROM LayoutPreview EL WITH(NOLOCK)
WHERE FileID=@FileID and (LayoutName like '%STD%' OR EL.LayoutName LIKE '%LAP%')
AND IsValidated = 0