We have a completely separate frontend project built on top of the nopCommerce backend. We basically created a new Web Application Project (Web API) and referenced Nop.Web.Framework, Nop.Services, Nop.Data, etc. The Nop.Web project is effectively unused, and even though it's a nice frontend, we needed a separate frontend project to give us ultimate flexibility. The frontend architecture is comprised of AngularJS (1.x) with WebAPI controllers serving as the interface to the backend.
In the very beginning I investigated an architecture where nopCommerce was extended with our needs through the plugin architecture. However, there was a combination of it being too limiting and/or having to make overly complicated solutions to have things work properly under the plugin model. I found it far easier to work directly with the source code and keeping things as separate as possible through partial class extensions and class inheritance. Hope this helps, thanks!