sqlcmd -b doesn't exit on error
The -b parameter applies to the batch, not statements within the script.  If you separate each statement with a GO batch terminator, you will get the behavior you expect.  

Remember that SQLCMD sends the entire batch of statements at once to SQL Server for execution.  You'll need T-SQL control flow statements (including TRY/CATCH) to handle errors on the server side, if needed.