loop logic within a function call

Right I'll start with the questions.

memset is a function that takes as its first parameter, a pointer to a block of memory (in our case its our boolean array), the second parameter is the value we want to set each byte of memory in this block (this part is important, because you couldnt use it to set the block value to anything meaninful above the byte boundary), and finally the last parameter is the size of the block of memory we set as the first parameter.

However simply in this case, we use it to clear the array all to 0, or false, another equally valid way would be to write a for loop to go through each element in the array and set it individually.

The boolean array I declared mirrors your led array, it essentially stops us from picking the same LED twice. For example, without it, we could potentially pick LED 5 ten times in a row. With it, it means we randomly pick an LED whose not been picked yet.

...And finally, the green light not lighting back up, yes there's a bug in the code, try this instead, see if you can spot the difference and why it should even make a difference:

const int buttonPin = 2;
const int readyLed  = 3; // Green LED means ready
const int ledPin1   = 4; // 1 to 5 five red LED beacons
const int ledPin2   = 5;
const int ledPin3   = 6;
const int ledPin4   = 7;
const int ledPin5   = 8;
const int ledBeacons [] = {4, 4, 5, 5, 6, 6, 7, 7, 8, 8};  //five LED pin designators replicated twice in the array
int buttonState = 0;
bool g_led_beacons_been_activated[10];
int g_button_press_counter = 0;

void setup() {
  
  Serial.begin (9600);
  randomSeed (analogRead(0));
  pinMode (readyLed, OUTPUT);
  pinMode (ledPin1, OUTPUT);
  pinMode (ledPin2, OUTPUT);
  pinMode (ledPin3, OUTPUT);
  pinMode (ledPin4, OUTPUT);
  pinMode (ledPin5, OUTPUT);
  pinMode (buttonPin, INPUT);

  memset( g_led_beacons_been_activated, 0, 10 );
}

void loop() {
   //===== Check the state of the button and run the routine only if button is pressed =====   
   
	if( g_button_press_counter == 0 )
	{
		digitalWrite(readyLed, HIGH);
	}
	else
	{
		digitalWrite(readyLed, LOW);
	}
 
	buttonState = digitalRead(buttonPin);

	if (buttonState == HIGH) 
	{   
		beacon_select();
		g_button_press_counter++;

		if( g_button_press_counter == 10 )
		{
			// start again yay! ...
			memset( g_led_beacons_been_activated, 0, 10 );
			g_button_press_counter = 0;	// This line is paramount, add it please 
		}
	} 
}

//===== my function to select randomly lit LED beacons =====

void beacon_select() 
{            
	int r = random (0,10);               
	while( g_led_beacons_been_activated[r] )
		r = random (0,10);
	int beacon = ledBeacons [r];    
	g_led_beacons_been_activated[r] = true;
	Serial.println (beacon);            //use serial window for diagnostic checks only
	digitalWrite (beacon, HIGH);     //display the activated LED for 0.5s on the prototyping board
	delay (500);
	digitalWrite (beacon, LOW);
}

Hey man, it Works!!

I modified the names of the array and counter just to make it easier to read and added one extra line of code so that the ready LED would extinguish on the first pass (button press). But other than that, it's beautiful.
Can't say enough thanks for helping me out. The world really is one big collective brain.

 buttonState = digitalRead(buttonPin);
         
         if (buttonState == HIGH)
         {
             digitalWrite (readyLed, LOW); //***** newly added code line *****
             beacon_select();
             bp_counter ++;                
             
             if(bp_counter == 10)
             {
               //===== start all over again =====
               memset(readyLedAct, 0, 10);
               bp_counter = 0;
             }
         }
}

You misunderstood my suggestion...

for (int x = 0; x <10 &&  !beacon_selected; x++){
  ...
  beacon_selected = beacon_select(...);
  ...
}

You will need to define beacon_select() as bool beacon_select(...).