This is a comment and suggestion rather than a solution
A WHERE EXISTS is not the best way for you here, it is overly complex for what you need. As a result it will be detrimental to the performance of the query. Also I note you include the code
AND tblOrders.bootSaleDate = @bootSaleDate
which pretty much does nothing. That suggests you've let it drift from where it should be. I did test your code and I don't get what you are seeing but your data may include factors my test does not. EXISTS returns a TRUE as soon as it finds something but that includes a NULL record (as opposed to no-records) so if your data causes a null to be returned by the sub-query then that might explain it. Whatever I am speculating I wouldn't waste time finding out what was wrong instead I'd recommend you continue first by removing the unnecessary complexity, and there is a much simpler method immediately available.
Remove the WHERE EXISTS completely and just add an AND to the ON clause of the tblItems inner join so
SELECT *,
CASE WHEN RowNo < cnt THEN 'N' ELSE 'Y' END AS lastbox
FROM
(
SELECT ROW_NUMBER() OVER (ORDER BY orderDate desc) as [RowNo],
COUNT(*) OVER () cnt,
tblAccounts.skypeUserName, tblAccounts.contactName, tblorders.friendlyOrderID
FROM tblOrders
INNER JOIN tblAccounts
ON tblOrders.accountID=tblAccounts.accountID
INNER JOIN tblItems
ON tblOrders.accountID=tblItems.accountID AND tblItems.fileID > 0
WHERE
tblOrders.bootSaleDate = @bootSaleDate
AND tblOrders.orderStatus='Completed'
) t
WHERE RowNo BETWEEN (@page*8)-7 AND (@page*8)
Much cleaner.