What you seek is actually something a bit different.
It is the observation that all software is built of 3 layers -
Inbound IO, what you call imperative shell
Business logic core, what you call functional core
Outbound IO, what you call again imperative shell.
The problem with the terms in functional programming is that when they say side effects, in most cases they mean IO.
The functional core does not have to be functional for you to get the benefits - easy testing, easy to reason about, easy to develop. In fact, in some cases, functional programing is the wrong tool while having a business logic core that is separated from IO is still a very valid architecture.