I thought, that external BGP sessions always set next hop to be their update source address (as if "next-hop-self" was used). Yet in the case I have just created in lab, my EBGP clearly does not change next hop address (as if "next-hop-unchanged" was configured).
Can you, please, enlighten me how it really is with eBGP next hop behaviour?
Think it's becoming clear now :-)
I think you are seeing this behaviour because all your routers are on the same L2 network. So what you are seeing is normal behaviour for BGP when all routers are connected to the same network. What happens is -
SW1 learns about the loopbacks from SW2. SW1 then sends the advertisements via EBGP to R4 but it does not set itself as the next hop because otherwise it would be an extra hop to get to SW2. As R4 & SW2 each have an interface in the same network R4 can send packets directly to SW2.
To test this have a dedicated subnet for connectivity between R4 and SW1. SW2 should share a subnet with SW1 only. Then i think you would see the behaviour you are expecting.