Sure it is possible to do both things (almost) in parallel.
But it is really true what @DaveX says
did you read? re-thinking
The idea is to do a very often repeating comparising of how much time has passed by since a reference-point in time.
And this is something completely different than "freeze microcontroller for 1000 milliseconds"
It really requires re-thinking. It is called non-blocking timing.
I have written a tutorial about it and I claim that it is easier to understand than most other tutorials about non-blocking timing
and as the second thing to learn is how to apply a state-machine to your code
each time your "delay"-code has a delay() in function loop
this delay() must be replaced by a state of the state-machine
The transition to the next state happens if the number of milliseconds have passed by
This is done by continiuosly comparing a timestamp against how much time has passed by since the timestamp has been stored
More details see the tutorial
best regards Stefan