well they are not much different for their own meaning. but the usage can be different'. you didn't mention about '사내아이' or '계집아이(need to be carefull with this word 계집아이 계집애, cuz if u call other people's kid with this word, they can be so offended. so please don't)' but they are synonym as well.
according to the dictionary,
1. the male who's young(남자아이)
2. when you talk about your own son to others, you can use this word
1. the kid who's male and not fully grown up yet.
2. the youth
3. (the law)less than 19 years old(korean age is different with western age, we consider 1 yr old when the baby's born)
same for female words.
so you can mix up a bit btw them like these.
저기 파란 셔츠를 입은 소년(사내아이,남자아이)은 민수다.
The boy there who's wearing the blue shirt is Minsoo.
but when it comes like, this it's different.
1) when we talk about our son or girl to other people, we can call our son' '사내애(사내아이), our daughter 계집애(계집아이)'
사내아인 오학년이고 계집아이는 2학년입니다.
that means 'my son is 5th grade and daughter is 2nd grade'. korean people think when they want to show their respect to others as they make themselves or their family members humble.
2) when they give a birth of their kids, nurses can say '남자아이 or 여자아이' or '사내아이 or 계집아이' or '왕자님prince or 공주님princess' but we don't say '소년 or 소녀' in this occasion
hope it could be helpful to you. :)