First of all, I agree with @SS_Rebelious. Your "zipcoords" object seems to represent a common data extent so, rather than creating a list object, why not just create a stack object of your rasters and extract everything at once? If common extents are a problem in the rasters, you can use the "quick=TRUE" argument in stack() to override the extent error.
Seemingly, the problem with your code is that nlayers cannot be applied to a list object. However, based on this, there is something suspect in the description of your problem in relation to your code. If sms is, in fact, a list object then nlayers should be throwing an error before the loop even starts. Please check you object classes using class(). Are you sure that sms is not a raster stack or brick? Double brackets will work for indexing both object classes.
It would have been nice to see how sms was created. Based on your code it looks like it could be a list of character raster names and not raster objects. If your sms object is a list of raster names and not raster objects, you will need to create a raster object for each raster in the loop.
You do not need to create a new raster object to extract the values, it just adds unnecessary overhead. Additionally, since all you want is the named flatfile output, and have no other need for the raster name, you do not need assign.
for (i in 1:length(sms)) {
y <- extract(sms[[i]], zipcoords)
write.csv(y, file=paste0(getwd(),names(sms[[i]][1]),".csv"),row.names=F)
}