Assuming that product_id is not the primary key of the table, you can do something like this:
Select ...
From Table
Join (
Select TOP 40 TablePK
From Table
Order by Abs( pnl ) Desc
) As Z
On Table.TablePK = Z.TablePK
Order By Table.pnl ASC
As OMG Ponies, mentioned, you could do this as a single derived table:
Select ...
From (
Select TOP 40 .....
From Table
Order by Abs( pnl ) Desc
) As Z
Order By Z.pnl ASC
If you wanted to use a CTE, then I'd do it with the ROW_NUMBER function:
With RankedItems As
(
Select ...
, ROW_NUMBER() OVER ( ORDER BY Abs(Table.pnl) ) As ItemRank
From Table
)
Select
From RankedItems
Where ItemRank <= 40
Order By pnl ASC