Please consider trying out this query, and let me know how it performs.
WITH EnumerableItemNames AS (
SELECT
PcsID = pcs.ID,
v.ColName,
ItemName = me.Name
FROM
dbo.Product_Coupling_Serial pcs
CROSS APPLY (VALUES
('DN', pcs.DN),
('PN', pcs.PN),
('Winder', pcs.Winder),
('CouplingType', pcs.CouplingType),
('Type', pcs.[Type]),
('ILayer', pcs.ILayer),
('OLayer', pcs.OLayer)
) v (ColName, EnumerableItemID)
LEFT JOIN dbo.Management_EnumerableItem me
ON v.EnumerableItemID = me.ID
)
SELECT
p.DN, p.PN, p.Winder, p.CouplingType, p.[Type], p.ILayer, p.OLayer
FROM
EnumerableItemNames ein
PIVOT (
Max(ein.ItemName)
FOR ein.ColName IN (DN, PN, Winder, CouplingType, [Type], ILayer, OLayer)
) p
;
While it could theoretically be a total failure in performance, I also think it could end up performing better. If it isn't better, you still might be able to get it there by inserting the results of the CTE (without the LEFT JOIN to Management_EnumerableItem) into a temp table with some carefully-chosen indexes, then doing a second query using the temp table. It does depend a bit on how exactly you're querying the table, how many rows it has, how wide they are, how many result rows there are, and so on.
If you need more columns from the Product_Coupling_Serial table, then you could try including those in the CTE, but that may affect the performance badly by bloating the memory required for the pivot operation, so you could also just join back to it at the end:
// CTE here...
SELECT
pcs.Year,
pcs.ProductCode,
pcs.QRText,
pcs.UniqueSerial,
...
p.DN, p.PN, p.Winder, p.CouplingType, p.[Type], p.ILayer, p.OLayer
FROM
EnumerableIDs ei
PIVOT (
Max(ei.ItemName)
FOR ei.ColName IN (DN, PN, Winder, CouplingType, [Type], ILayer, OLayer)
) p
INNER JOIN dbo.Product_Coupling_Serial pcs
ON ei.PcsID = pcs.ID
;