Hi Anant!
This is going to be a boring answer but the truth is there is no one particular part that is / has been the most difficult. One difficult problem that comes to mind is handling versioning our native code elegantly. It's something that most people using Expo just take for granted, but there was a long period of time where the Expo client wasn't capable of doing this. The Expo client needs to support multiple versions of React Native in a single binary. If you built an app 6 months ago and want to use the Expo client to open it today, 6 releases later (we do monthly releases), it will still work. We include I believe 7 versions currently. Each of the APIs that Expo includes also needs to be versioned, and their dependencies.