Всё потому, что вы используете одно и то же подключение к базе данных. Получается так:
1. Запрашиваются записи из db_news, база принимает этот запрос как текущий.
2. Читается первая запись текущего запроса, т.е. из db_news.
3. Через это же подключение запрашиваются записи из db_news_img. База запоминает новый запрос как текущий, готова передавать записи из db_news_img.
4. Читается первая запись текущего запроса, т.е. из db_news_img.
5. Возврат к началу цикла, хочется прочитать из db_news. Но этот запрос уже не является текущим, он "потерян", поэтому из него невозможно получить данные.
6. Данных нет - значит конец цикла.
Вам нужно запоминать и использовать указатель запроса, скорее всего так:
$db_res1 = $db->Query("SELECT * FROM db_news WHERE cat_id = '$catid' ORDER BY id DESC");//
if($db_res1->NumRows() > 0){
while($news = $db_res1->FetchArray()){
$textfull = $news["news"];
$db_res2 = $db->Query("SELECT * FROM db_news_img WHERE news_id = '$news[id]' ORDER BY id DESC");//
if($db_res2->NumRows() > 0){
while($img = $db_res2->FetchArray()){