PIC16F57 timer how to trigger an interrupt
The PIC16F57 has no interrupts so everything must be done by polling. The trick with polling is to do it in a way that doesn't block other operations.

Instead of waiting for 3 seconds after detecting the switch closure, wait for a much shorter time eg. 30ms, increment a counter, then check the switch again. If the switch is now open then reset the counter and go back to waiting for the switch to close. If the counter reaches 100 the switch has been closed for 100*30ms = 3 seconds, so you can turn on the LED and then just wait for the switch to open.

This method is a simple form of cooperative multitasking, where each 'task' (checking the switch, counting time, operating the LED) gets control of the CPU in sequence. It relies on each task only 'running' for a short time before handing control to the next one, and storing its current state (in this case the time count) in static variables so it can pick up from where it was the last time it 'ran'. With careful coding you can make the MCU appear to be doing several things simultaneously.