José, boas noites!!
Bati o olho e ja vi um problema em seu código!
Veja a correção ( eu tirei os acentos e etc, pois meu "uindus" é em inglês, então, o console não mostra os acentos )
Troquei a variavel de entrada do for each, para não utilizar a referencia, pois tenho apenas o xHarbour em meu computador e o xHarbour não suporta variavel por referencia no foreach
Utilize a função "IsSpace" e não "space(1)", caso a string de entrada tenha tabs, por exemplo, a função IsSpace vai identificar isso
PROCEDURE MAIN
LOCAL cText
CLS
cText := "ISTO E UMA BENCAO"
@ 1, 0 SAY cText
@ 2, 0 SAY CaseCapital( cText )
Inkey(0)
RETURN
FUNCTION CASECapital( cText )
LOCAL lUpper := .T., cLetter
cText := Lower( cText )
FOR EACH cLetter IN cText
IF lUpper .AND. !IsSpace(cLetter)
cText[HB_EnumIndex()] := Upper( cLetter )
lUpper := .F.
ENDIF
IF IsSpace(cLetter)
lUpper := .T.
ENDIF
NEXT
RETURN cText