I haven't written anything in assembly in a decade. However, back when I did it, I did some pretty cool stuff that FORCED me to learn not just the way the machine does things but the order in which all of the software layers interact. By integrating my assembly systems with high-level OO languages, I had to learn exactly how OO was implemented, and what the benefits and drawbacks to all of those compiler options are.
This has made me a better programmer at all levels. To this day, I am the only one in the office who can explain and fix the really bizarre COM/DCOM problems people run into periodically or intelligently explain why DCL (in Java) is what it is.
Did assembly language do all of this for me? Absolutely not. But I would say that the in-depth experience that I had with assembly was the most valuable part of my development as a programmer. Who knows, there may have been other (even better) ways to get to the same place in my development, but personally, I wouldn't trade the lessons learned from assembly development for anything.
As an aside, I didn't really cut my teath on MASM. I found the path of least resistance was to start with the old Borland Pascal or C compilers which had good support for inline assembly. At the beginning, this let you step down to assembly without giving up all of the built-in stuff (and having to learn the calling conventions up front was good background). It wasn't long before I was using Turbo Assembler and building stand-alone modules.
I personally find no use for assembly coding in my present job. And I think most jobs are like that. It still needs to be taught better in schools, though. We need more people who can "see through the layers" of software and easily translate their high level actions into how all of the moving parts interoperate.