How to implement composite partition (Range list / Hash range) partition in SQL server?
My requirement is first do the list based on state then do the range based on year


That's not a requirement: that's a design.  SQL Server doesn't do that.  

Instead, you need to look to the data structure to provide the efficient access pattern within each partition.

If you use a clustered index, then within each partition SQL can perform efficient range scanning by the leading index columns.  

And if you use a clustered Columnstore index SQL can use Rowgroup Elimination