To do this natively would be non-trivial and hard-coded: you could only choose one product at a time for the "without" clause. Here's how you could approach this:
- Create a custom field on OpportunityLineItem to store the marker for the data (e.g. product name).
- Create a workflow rule on OpportunityLineItem with a field update to copy Product Name (or other marker) to the field from prior step.
- Create a rollup summary field on Opportunity to count all records that meet a certain criteria from the prior step (e.g. Product Name equals "Acme Crowbar").
- Create a rollup summary field on Account to sum the value of the count from the prior step.
- Execute a data load, from Apex Code or the Data Loader to update all records with the workflow rules.
- You can now run a simple report on Accounts that identifies if they have ever purchased a given product.
To change which product you're looking to see has never been sold, you'll have to change the workflow field update, then run another data load pass.
In other words, there is no report that will give you this data easily; these types of queries are far easier to perform in Visualforce/Apex Code than in the reporting tool.
Alternatively, you could just export your data to an offline reporting tool and look for the data that way.