The trend to outsourcing contractors began in the 90s. Because of the extremely cheap and vast labor pool in a time that the US was struggling to fill seats in IT. But in the last 20 years, the talent pool in the US has skyrocketed as well as the quality of work.
Time difference issues. If your company is in the US that means your administration and supporting teams are going to be nearly half a day offset from the development teams, which means any time they have a password issue, issue with needing a server fixed, networking issue or any host of other very common day-to-day issues that occur there will be a massive lag time between ticket in and ticket closed, so even a trivial blocking issue that takes minutes to fix might end up blocking your development for an entire day.
Solution: companies who are oriented to the USA and works 24\7
There are some of them in Ukraine
The culture/language concerns. While working with Ukrainian developers could happen that one couldn’t understand what the other was saying and, as the contractors that are external to the company, there is a tendency to agree with whatever a client is say even when they don’t understand what was asked. This can result in having the same meeting over and over as one side or the other (or both!) misunderstand what is being said.
Solution: pay huge attention to the team’s communication skills
Familiarity with the problem domain. Banking software in the US requires familiarity with US banking regulations. Medical device software requires familiarity with US FDA regulations. Developing something like a word processor requires not just programming skill, but UX and Usability skills that aren’t nearly as common as plain programming skills, and often American English (in addition to localized versions for other English speaking countries).
Solution: you can prepare the list of information which should be clear for a development team. Or you can hire a product manager in the US who will work with a development team in Ukraine