SELECT statements do indeed apply locks unless there is a statement at the top of the query SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED.
By all means use WITH (NOLOCK)
in SELECT statement on tables that have a clustered index, but it would be wiser to only do so if there's a need to.
Hint: The easiest way to add a clustered index to a table is to add an Id Primary Key column.
The result set can contain rows that have not yet been committed, that are often later rolled back.
If WITH(NOLOCK) is applied to a table that has a non-clustered index then row-indexes can be changed by other transactions as the row data is being streamed into the result-table. This means that the result-set can be missing rows or display the same row multiple times.
READ COMMITTED adds an additional issue where data is corrupted within a single column where multiple users change the same cell simultaneously.
Bearing in mind the issues WITH(NOLOCK) causes will help you tune your database.
As for your boss, just think of them as a challenge.